【问题标题】:Visual Studio References and versioning - how does it work?Visual Studio 参考和版本控制 - 它是如何工作的?
【发布时间】:2008-10-09 10:16:05
【问题描述】:

我们有几个常见的库。理想情况下,我们希望它们都使用最新版本的 dll,即使它们是针对旧的不同版本编译的(假设最新版本向后兼容)

例如我们有:

项目 dll
常用控件dll
记录 dll
数据库访问dll

项目和公共控件参考数据库 dll 的 v2。然而,日志记录参考 v1。

如果在不同的组件中引用了不同的版本,VS 如何选择使用哪一个?
我们是否必须重新编译 v1 dll 才能使用最新的数据库 (v2) 或者我们可以让它自动获取?
是否可以强制使用特定版本?

谢谢,

亚历克斯

【问题讨论】:

    标签: .net visual-studio dll


    【解决方案1】:

    默认情况下,对于版本化的 DLL,我相信 VS 会强制进行完全匹配。但是,如果您查看参考的属性,您会发现一个名为“特定版本”的属性。将其设置为“false”,它将匹配更高版本。

    很遗憾,我没有完整版的 VS,无法找到合适的 MSDN 链接。

    此外,您还可以在 app.config 中使用 assemblyBinding 元素。

    【讨论】:

    • 感谢您的 assemblyBinding 链接,但在 vs2008 中找不到此特定版本属性的网站项目?
    • 啊,具体版本属性在类项目和web应用项目中,而不是网站项目中
    • 对于程序化方法,<SpecificVersion>False</SpecificVersion> 可以添加到项目中您希望版本元数据解耦的每个引用中。
    • @jon:项目引用了 v2.0 库(32 位)。它在 GAC 中部署到具有 v1.0 的 64 位 Web 服务器。任何 CPU 编译都是必要的。 Copy Local 因运行时的 32/64 问题而崩溃。预期的。当用 v2.0 64 位覆盖本地 bin 文件时,它仍然会因为缺少功能而大吵大闹,就像它仍在拖拽 GAC_64 v1.0 副本一样。有什么想法吗?谢谢。
    • @one.beat.consumer:不是真的 - 我建议你为此创建一个新问题。
    【解决方案2】:

    这里实际上有两种情况 - 使用强名称/GAC,或者不使用强名称。

    如果您使用强名称并将组件安装到 GAC 中,那么 .Net 将希望使用客户端在编译时引用的组件版本。因此,在您的示例中,Project 很可能引用数据库 V2,而 Logging 引用数据库 V1,因为 DLL 可以并行存储在 GAC 中。因此,如果您确实希望 Logging 使用 V2 而不是 V1,则需要修改配置文件以说明“对 V1 的引用应该指向 V2”。有不同的地方可以做到这一点 - 应用程序文件、机器文件等。

    如果您不使用强名称,那么 .Net 将默认使用与客户端位于同一文件夹中的 DLL 版本。因此,假设您将 Project、CommonControls 和 Logging 部署在与数据库 V2 相同的文件夹中。然后,即使 Logging 是针对数据库 V1 构建的,它也会尝试使用同一文件夹中的组件,即数据库 V2。只要 V2 可以提供 Logging 想要使用的相同公共类和方法,它就可以正常工作。

    在我的环境中——我们所有的应用程序都是内部的——我们不使用 GAC。我们只是将应用程序需要的所有文件部署到一个文件夹中。当你有很多通用组件时,保持配置文件同步简直就是一场噩梦。

    这与 COM 完全不同,COM 中所有应用程序都获取当前注册的 DLL 副本(假设 V1 和 V2 是二进制兼容的)。

    【讨论】:

      【解决方案3】:

      我看到这个网站有几个建议: http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/

      要获得特定版本显然您必须编辑 web.config 或 app.config?

      “最后,使用记事本查看您的 csproj 文件(或在 Visual Studio 中卸载项目以便能够将其作为文本打开)。当您使用 Visual Studio 添加引用时,您将获得包含两个版本号的程序集引用和公钥,当您将供应商程序集升级到较新版本时,这会给您带来一些麻烦。"
      http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/

      【讨论】:

        【解决方案4】:

        如果您有源代码,您可以使用项目引用而不是 dll 引用。这样您就可以随时获得最新消息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-08
          • 2017-08-06
          • 2016-02-18
          • 1970-01-01
          • 2018-02-15
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          相关资源
          最近更新 更多