2015-03-19 124 views
11

我目前正在努力解决由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\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. 手动从它的位置在C:\Windows\assembly\GAC_MSIL
  2. 复制Microsoft.SqlServer.Types.dll添加到副本的引用。
  3. 确保参考具有Copy Local设置为False
  4. 生成项目,并确保Microsoft.SqlServer.Types.dll肯定是不存在的输出。
  5. 测试项目... 没问题!

所以,如果组件可从GAC在运行时被解析为满足这种依赖关系,为什么没有在参考浏览器添加引用时显示?为什么我必须将其从GAC中复制并引用副本?

在我的印象中,理想的工作流程会是这样:

  1. 上开发机上安装可再发行的MSI。
  2. 如果您的产品是通过MSI部署的,或者在使用'xcopy'部署时手动安装,请确保将可再发行组件安装在目标机器上,方法是将其列为MSI依赖项。
  3. 参考Microsoft.SqlServer.Types从GAC使用参考浏览器就像任何框架库一样。 (Copy Local默认设置为False)。
  4. 在运行时,Microsoft.SqlServer.Types(平台不可知)将从GAC中解析出来,非托管库的相应副本将根据进程体系结构从系统位置加载。
  5. 不用担心!

显然,第3步不会发生。我错过了什么吗?也许我误解了GAC本身 - 这不会是第一次。为什么微软这样做?我能接近理想的工作流程吗?

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

+0

管理解决它?我有一个类似的问题,因为我想使用geojson.net它有一个nuget包与这些dll的 – 2016-04-18 12:45:00

+0

你有没有解决这个问题?你知道什么是获得这种参考的最佳方式吗? – GuidoG 2016-08-08 07:29:24

+0

不 - 我在一年多的时间里没有参与过这个项目,也没有遇到过需要我在另一个项目上解决这个问题的情况。抱歉。 – Xharlie 2016-08-08 17:20:25

回答

3

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

相关问题