全局程序集缓存中的 Microsoft.SqlServer.Types.dll?

2024-01-08

我目前正在努力解决由以下原因引起的部署问题Microsoft.SqlServer.Types及其关联的非托管库,SqlServerSpatial110.dll- 两者都是为了微软 SQL Server 2012。这些问题很容易解决,只是典型的缺少 DLL问题,但我正在尝试决定perfect处理这些依赖关系的方法。

首先,我必须声明,我不同意手动部署任一库的流行观点(通常通过将它们复制到项目的输出目录中,或者可怕的是,复制到System32本身)是正确的。 Microsoft 为这些文件提供可再发行的 MSI 安装程序,这些安装程序将这些文件放入系统位置。很明显,他们希望我们依赖那些单独安装的可再发行组件,或者作为 MSI 本身内置的经过尝试和测试的依赖机制的一部分。

在发布时,可以从以下位置下载这些可再发行版本的最新版本:http://www.microsoft.com/en-gb/download/details.aspx?id=43339 http://www.microsoft.com/en-gb/download/details.aspx?id=43339

For SqlServerSpatial110.dll,看起来没有任何问题。 MSI 安装程序(特定于平台)将文件放入Windows\System32 or Windows\SysWOW64这是适当的,一切都很好。

托管包装库,Microsoft.SqlServer.Types.dll,更加混乱。

在我看来,该文件被放入全局程序集缓存中 - 运行 MSI 后,在我的计算机上,我可以看到它位于C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll该文件具有正确的版本和修改日期。

奇怪的是,我无法在 Visual Studio 的参考浏览器或 Windows 资源管理器中直接看到它 - 只能在 Mythicsoft 的老式文件系统搜索工具中看到。为什么我看不到?

由于该文件是almost在 GAC 中,我猜想引用它的项目应该not制作它的本地副本 - 他们应该依赖目标系统上的它。我测试了这个假设并且它有效:

  1. 手动复制Microsoft.SqlServer.Types.dll从它的位置C:\Windows\assembly\GAC_MSIL
  2. 添加对副本的引用。
  3. 确保参考文献有Copy Local set to False
  4. 构建项目并确保Microsoft.SqlServer.Types.dll绝对不存在于输出中。
  5. 测试项目...没问题!

那么,如果可以在运行时从 GAC 解析程序集以满足此依赖性,那么为什么在添加引用时它没有显示在引用浏览器中呢?为什么我必须将其从 GAC 中复制出来并引用该副本?

在我看来,理想的工作流程会是这样的:

  1. 在开发计算机上安装可再发行的 MSI。
  2. 如果您的产品是通过 MSI 部署的,则可通过将其列为 MSI 依赖项来确保可再发行组件已安装在目标计算机上;如果您使用的是“xcopy”部署,则可以手动安装它。
  3. 参考Microsoft.SqlServer.Types就像任何框架库一样,使用参考浏览器从 GAC 获取。 (Copy Local将被设置为False默认情况下。)
  4. 在运行时,Microsoft.SqlServer.Types(与平台无关)将从 GAC 中解析,并且将根据进程架构从系统位置加载非托管库的适当副本。
  5. 不用担心!

显然,第 3 步不会发生。我错过了什么吗?也许我误解了 GAC 本身 - 这不是第一次了。微软为什么要这么做呢?我能更接近我理想的工作流程吗?

也许有一种完全不同的方式来管理这种依赖性——这是我显然没有想到的。如果是这样,那是什么?你如何处理?


如果这是一键部署,则转到“项目|属性|发布”选项卡并单击“应用程序文件...”按钮。然后,您应该选择相关文件并确保为“发布状态”值选择“包含(自动)”。原因是 VS 似乎足够智能,可以确定该文件是否是已知可再发行的一部分,这使您可以选择在安装过程中作为依赖项依赖外部包或自己管理该文件。如果您依赖该软件包,那么最终用户可以通过添加删除程序来卸载,并且您的应用程序将被破坏:/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全局程序集缓存中的 Microsoft.SqlServer.Types.dll? 的相关文章

随机推荐