我目前正在努力解决由Microsoft.SqlServer.Types
及其关联的非托管库SqlServerSpatial110.dll
导致的部署问题 - 这两个问题都适用于Microsoft SQL Server 2012。这些问题轻而易举地解决,只是典型的缺少DLL问题,但我试图决定用完美的方式来处理这些依赖关系。首先,我必须声明,我不同意手动部署任一库(通常通过将它们复制到项目的输出目录中,或者可怕地将它们复制到System32
本身中)是正确的。 Microsoft为这些文件提供可再发行的MSI安装程序,这些安装程序将这些文件放入系统位置。看起来显而易见的是,他们希望我们依赖于单独安装的这些可再发行组件,或者作为MSI本身内置的久经考验的依赖性机制的一部分。全局程序集缓存中的Microsoft.SqlServer.Types.dll?
在发布的时候,这些可再发行组件的最新版本可从以下网址下载: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部署的,或者在使用'xcopy'部署时手动安装,请确保将可再发行组件安装在目标机器上,方法是将其列为MSI依赖项。
- 参考
Microsoft.SqlServer.Types
从GAC使用参考浏览器就像任何框架库一样。 (Copy Local
默认设置为False
)。 - 在运行时,
Microsoft.SqlServer.Types
(平台不可知)将从GAC中解析出来,非托管库的相应副本将根据进程体系结构从系统位置加载。 - 不用担心!
显然,第3步不会发生。我错过了什么吗?也许我误解了GAC本身 - 这不会是第一次。为什么微软这样做?我能接近理想的工作流程吗?
也许有一种完全不同的方式来管理这种依赖关系 - 这是我明显没有想到的。如果是这样,那是什么?你如何处理它?
管理解决它?我有一个类似的问题,因为我想使用geojson.net它有一个nuget包与这些dll的 – 2016-04-18 12:45:00
你有没有解决这个问题?你知道什么是获得这种参考的最佳方式吗? – GuidoG 2016-08-08 07:29:24
不 - 我在一年多的时间里没有参与过这个项目,也没有遇到过需要我在另一个项目上解决这个问题的情况。抱歉。 – Xharlie 2016-08-08 17:20:25