我目前正在努力解决由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中的文件几乎,我猜测引用它的项目应该不制作它的本地副本 - 它们应该依赖它在那里目标系统。我测试了这个假设并且有效:
Microsoft.SqlServer.Types.dll
C:\Windows\assembly\GAC_MSIL
Copy Local
设置为False
Microsoft.SqlServer.Types.dll
。因此,如果可以在运行时从GAC解析程序集以满足此依赖性,那么在添加引用时,为什么它不会显示在引用浏览器中?为什么我必须将其从GAC中复制出来并引用该副本?
在我看来,理想的工作流程就是这样:
Microsoft.SqlServer.Types
,就像任何框架库一样。 (默认情况下,Copy Local
将设置为False
。)Microsoft.SqlServer.Types
(平台不可知),并且将根据流程架构从系统位置加载非托管库的相应副本。也许有一种完全不同的方式来管理这种依赖 - 我显然没有想到这一点。如果是这样,它是什么?你是如何处理的?
答案 0 :(得分:2)
如果这是单击部署,则转到项目|属性|发布选项卡,然后单击"应用程序文件..."按钮。然后,您应该选择相关文件,并确保"包含(自动)"被选中用于"发布状态"值。原因是看起来VS足够聪明,可以确定文件是否是已知可再发行组件的一部分,这使您可以选择在安装期间依赖外部包作为依赖项或自己管理文件。如果你依赖包,那么最终用户可以通过添加删除程序卸载并且你的应用程序被破坏:/