我目前正在努力解决由以下原因引起的部署问题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制作它的本地副本 - 他们应该依赖目标系统上的它。我测试了这个假设并且它有效:
- 手动复制
Microsoft.SqlServer.Types.dll
从它的位置C:\Windows\assembly\GAC_MSIL
- 添加对副本的引用。
- 确保参考文献有
Copy Local
set to False
- 构建项目并确保
Microsoft.SqlServer.Types.dll
绝对不存在于输出中。
- 测试项目...没问题!
那么,如果可以在运行时从 GAC 解析程序集以满足此依赖性,那么为什么在添加引用时它没有显示在引用浏览器中呢?为什么我必须将其从 GAC 中复制出来并引用该副本?
在我看来,理想的工作流程会是这样的:
- 在开发计算机上安装可再发行的 MSI。
- 如果您的产品是通过 MSI 部署的,则可通过将其列为 MSI 依赖项来确保可再发行组件已安装在目标计算机上;如果您使用的是“xcopy”部署,则可以手动安装它。
- 参考
Microsoft.SqlServer.Types
就像任何框架库一样,使用参考浏览器从 GAC 获取。 (Copy Local
将被设置为False
默认情况下。)
- 在运行时,
Microsoft.SqlServer.Types
(与平台无关)将从 GAC 中解析,并且将根据进程架构从系统位置加载非托管库的适当副本。
- 不用担心!
显然,第 3 步不会发生。我错过了什么吗?也许我误解了 GAC 本身 - 这不是第一次了。微软为什么要这么做呢?我能更接近我理想的工作流程吗?
也许有一种完全不同的方式来管理这种依赖性——这是我显然没有想到的。如果是这样,那是什么?你如何处理?