34

如果 A 引用程序集 B 1.1 和 C,而 C 引用 B 1.2,如何避免程序集冲突?

我很好地假设 C 的引用会被封装掉并且不会导致任何问题,但似乎所有的 dll 都被复制到了 bin 中,这就是问题发生的地方。

我了解解决此问题的两种方法是使用 GAC 或程序集绑定?GAC 对我来说似乎不是最好的方法,因为我不喜欢假设 dll 会在那里,我更喜欢在我的解决方案中从 lib 目录中引用 dll。

由于程序集绑定对我来说似乎不健壮,如果程序集的一个版本具有另一个版本没有的功能怎么办,这不会产生问题吗?


在我的情况下,因为我使用的是第 3 方 dll,它使用的是旧版本的 nHibernate,而不是我自己使用的。

4

5 回答 5

9

我过去使用 GAC 也取得了相同的结果,但您应该质疑您必须参考多个版本的原因,并尽可能避免使用它。如果您必须这样做,绑定重定向可能会对您的情况有所帮助。

另外,你读过这个吗?

于 2008-10-21T19:45:17.010 回答
6

一种看似鲜为人知的方法是使用 extern 关键字。

来自C# 参考

要引用具有相同完全限定类型名称的两个程序集,必须在命令提示符处指定别名,如下所示:

/r:GridV1=grid.dll

/r:GridV2=grid20.dll

这将创建外部别名 GridV1 和 GridV2。要在程序中使用这些别名,请使用extern 关键字引用它们。例如:

外部别名 GridV1;

外部别名 GridV2;

每个外部别名声明都引入了一个额外的根级命名空间,它与全局命名空间平行(但不在其中)。因此,每个程序集的类型可以通过使用它们的完全限定名称来毫无歧义地引用,该名称植根于适当的命名空间别名中。

在前面的示例中,GridV1::Grid 将是来自 grid.dll 的网格控件,而 GridV2::Grid 将是来自 grid20.dll 的网格控件。

于 2011-08-23T21:03:03.153 回答
3

我被要求支持多个版本的程序集并找到了这个解决方案:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyAssembly" publicKeyToken="..." />
        <codeBase version="1.1.0.0" href="MyAssembly_v1.1.0.0.dll"/>
        <codeBase version="2.0.0.0" href="MyAssembly_v2.0.0.0.dll"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
于 2013-08-01T19:37:46.897 回答
1

您可以将bindingRedirect 元素添加到配置文件中,以指定要在运行时使用的程序集版本。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>
于 2008-10-21T19:59:59.117 回答
1

.NET 运行时完全能够同时加载同一程序集的多个版本。但是,如果您要打开这个蠕虫罐头,我强烈建议您只命名您的程序集并使用 Major.Minor.* 命名方案以避免命名冲突。

我认为您不应该想出一种千篇一律的方法来使用(或不使用)GAC。如果您想自动使用随 DLL 的未来版本发布的新功能,GAC 会非常好。当然,这种祝福的代价是新版本可能不会像您期望的那样工作:)。这完全取决于什么是最实用的,以及您对发布到 GAC 的内容有多少控制权。

问候,-艾伦。

于 2008-10-21T20:04:44.210 回答