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

时间:2015-03-19 11:39:57

标签: sql-server dll spatial gac

我目前正在努力解决由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\System32Windows\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中的文件几乎,我猜测引用它的项目应该制作它的本地副本 - 它们应该依赖它在那里目标系统。我测试了这个假设并且有效:

  1. Microsoft.SqlServer.Types.dll
  2. 中的位置手动复制C:\Windows\assembly\GAC_MSIL
  3. 添加对副本的引用。
  4. 确保引用的Copy Local设置为False
  5. 构建项目并确保输出中绝对不存在Microsoft.SqlServer.Types.dll
  6. 测试项目...... 没问题!
  7. 因此,如果可以在运行时从GAC解析程序集以满足此依赖性,那么在添加引用时,为什么它不会显示在引用浏览器中?为什么我必须将其从GAC中复制出来并引用该副本?

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

    1. 在开发计算机上安装可再发行的MSI。
    2. 如果您的产品是通过MSI部署的,或者如果您正在使用' xcopy'手动安装,请确保将目标计算机上的可再发行组件列为MSI依赖项。部署。
    3. 使用引用浏览器从GAC引用Microsoft.SqlServer.Types,就像任何框架库一样。 (默认情况下,Copy Local将设置为False。)
    4. 在运行时,将从GAC解析Microsoft.SqlServer.Types(平台不可知),并且将根据流程架构从系统位置加载非托管库的相应副本。
    5. 不用担心!
    6. 显然,第3步并没有发生。我错过了什么吗?也许我误解了GAC本身 - 它不会是第一次。为什么微软这样做了?我能接近理想的工作流程吗?

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

1 个答案:

答案 0 :(得分:2)

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