【发布时间】:2015-03-19 11:39:56
【问题描述】:
我目前正在努力解决由 Microsoft.SqlServer.Types 及其关联的非托管库 SqlServerSpatial110.dll 引起的部署问题 - 两者都适用于 Microsoft SQL Server 2012。这些问题很容易解决,只是典型的缺少 DLL 问题,但我正在尝试确定处理这些依赖关系的完美方法。
首先,我必须声明,我不同意手动部署任何一个库(通常是通过将它们复制到项目的输出目录,或者,可怕的是,复制到 System32 本身)是正确的流行观点。 Microsoft 为这些文件提供可再分发的 MSI 安装程序,并且这些安装程序将文件放入系统位置。很明显,他们希望我们依赖那些单独安装的可再发行组件,或者作为 MSI 本身内置的久经考验的依赖机制的一部分。
在发布时,可以从以下位置下载这些可再发行组件的最新版本:http://www.microsoft.com/en-gb/download/details.aspx?id=43339
对于SqlServerSpatial110.dll,似乎没有任何问题。 MSI 安装程序(特定于平台)根据需要将文件放入 Windows\System32 或 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 的非常老式的文件系统搜索工具中看到。 为什么我看不到?
由于文件在 GAC 中几乎,我猜想引用它的项目应该不制作它的本地副本 - 他们应该依赖它在那里目标系统。我测试了这个假设并且成功了:
- 从
C:\Windows\assembly\GAC_MSIL中的位置手动复制Microsoft.SqlServer.Types.dll - 添加对副本的引用。
- 确保引用已将
Copy Local设置为False - 构建项目并确保
Microsoft.SqlServer.Types.dll绝对不会出现在输出中。 - 测试项目...没问题!
那么,如果程序集可以在运行时从 GAC 解析以满足这种依赖关系,为什么在添加引用时它不显示在引用浏览器中?为什么我必须将其从 GAC 中复制出来并引用该副本?
在我看来,理想的工作流程应该是这样的:
- 在开发机器上安装可再发行的 MSI。
- 如果您的产品是通过 MSI 部署的,请将可再发行组件列为 MSI 依赖项,或者如果您使用“xcopy”部署,请手动安装它,以确保将可再发行组件安装在目标计算机上。
- 使用参考浏览器从 GAC 参考
Microsoft.SqlServer.Types,就像任何框架库一样。 (Copy Local默认设置为False。) - 在运行时,
Microsoft.SqlServer.Types(与平台无关)将从 GAC 中解析,并且非托管库的适当副本将从系统位置加载,具体取决于进程架构。 - 不用担心!
显然,第 3 步不会发生。我错过了什么吗?也许我误解了 GAC 本身——这不是第一次。为什么微软会这样做?我可以更接近理想的工作流程吗?
也许有一种完全不同的方式来管理这种依赖关系——这显然是我没有想到的。如果是这样,它是什么?你是怎么处理的?
【问题讨论】:
-
设法解决了吗?我有一个类似的问题,因为我想使用 geojson.net,它有一个带有这些 dll 的 nuget 包
-
你解决过这个问题吗?你知道让这个参考工作的最佳方法是什么吗?
-
否 - 我已经有一年多没有从事这个项目了,也没有遇到需要我在另一个项目中解决它的情况。对不起。
-
有谁解决了这个问题?
标签: sql-server dll spatial gac