【问题标题】:Microsoft.SqlServer.Types.dll in the Global Assembly Cache?全局程序集缓存中的 Microsoft.SqlServer.Types.dll?
【发布时间】: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\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 中的位置手动复制Microsoft.SqlServer.Types.dll
  2. 添加对副本的引用。
  3. 确保引用已将Copy Local 设置为False
  4. 构建项目并确保Microsoft.SqlServer.Types.dll 绝对不会出现在输出中。
  5. 测试项目...没问题!

那么,如果程序集可以在运行时从 GAC 解析以满足这种依赖关系,为什么在添加引用时它不显示在引用浏览器中?为什么我必须将其从 GAC 中复制出来并引用该副本?

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

  1. 在开发机器上安装可再发行的 MSI。
  2. 如果您的产品是通过 MSI 部署的,请将可再发行组件列为 MSI 依赖项,或者如果您使用“xcopy”部署,请手动安装它,以确保将可再发行组件安装在目标计算机上。
  3. 使用参考浏览器从 GAC 参考 Microsoft.SqlServer.Types,就像任何框架库一样。 (Copy Local 默认设置为False。)
  4. 在运行时,Microsoft.SqlServer.Types(与平台无关)将从 GAC 中解析,并且非托管库的适当副本将从系统位置加载,具体取决于进程架构。
  5. 不用担心!

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

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

【问题讨论】:

  • 设法解决了吗?我有一个类似的问题,因为我想使用 geojson.net,它有一个带有这些 dll 的 nuget 包
  • 你解决过这个问题吗?你知道让这个参考工作的最佳方法是什么吗?
  • 否 - 我已经有一年多没有从事这个项目了,也没有遇到需要我在另一个项目中解决它的情况。对不起。
  • 有谁解决了这个问题?

标签: sql-server dll spatial gac


【解决方案1】:

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

【讨论】:

  • 我的不够聪明,它提供了先决条件(自动),无论我选择什么都会出现相同的需求错误,即使我选择包含,这个 ClickOnce 总是给我和我的客户带来问题,它只是废话!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2017-09-01
  • 1970-01-01
相关资源
最近更新 更多