使用外部程序集:定位程序集的清单定义与程序集引用不匹配

时间:2011-06-29 22:47:42

标签: .net assemblies conflict assembly-references

我知道这个问题似乎在stackoverflow和网络上得到了解答,但我的问题不同。

当我进行以下设置时,我试图了解如何不使用GAC(老板说不):

该项目使用NHibernate和Antlr3.Stringtemplate 这两个都是第三方集会。 NHibernate引用了Antlr3.Runtime版本3.1.3.42154 Antlr3.Stringtemplate引用了Antlr3.Runtime版本3.3.1.7705

当另一个不可用时,会出错。

我尝试绑定重定向,但这不起作用,因为版本之间的publicKeyToken不同。它最终寻找一个3.3.17705,其公钥标记与3.1.3.42154版本相匹配。

在GAC中安装一个或两个工作。但是,我的老板不会让我在GAC中安装任何东西。

我还尝试将两个DLL放在BIN目录中,方法是包含一个带有3.1.3.42154版本文件夹的Lib项目。 我告诉它总是复制,所以我得到/bin/Lib/3.1.3.42154/Antlr.Runtime.dll 然后我添加了一个探测元素来探测该目录。 这没用,我得到了同样的错误。

如何使用引用其他第三方程序集的第三方程序集,两者都引用不同的版本?

更新:

    System.Reflection.Assembly.LoadFile(@"Antlr3.Runtime.dll"); // 3.3.1        
    System.Reflection.Assembly.LoadFile(@"Antlr3.Runtime\Antlr3.Runtime.dll"); // 3.1.3

AppDomain.CurrentDomain.GetAssemblies()显示版本是在应用程序域中加载的,但仍然存在错误,说无法找到3.1.3。

以下是在调用错误代码之前从AppDomain.CurrentDomain.GetAssemblies()加载的内容。前两行是GetAssemblies()中的第三行,第三行是错误所说的缺失。

{Antlr3.Runtime, Version=3.3.1.7705, Culture=neutral, PublicKeyToken=eb42632606e9261f}
{Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7}
 Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7

1 个答案:

答案 0 :(得分:1)

解决了这个问题。

这是使用Antlr3.StringTemplate的特定问题 制作stringtemplate的人实际上下载了antlr的源代码并使用他的应用程序构建它而不是分发原始的antlr dll。他的新antlr dll具有相同的名称,但签名不同。他更改了版本和公钥标记。因此,如果您尝试将原始内容与NHibernate等内容一起使用,则会导致非常糟糕的冲突。

所以解决方案是使用ILMerge将他的自定义Antlr3 DLL合并到string.template DLL中,以使string.template dll仅依赖于它自己。我将Antlr3.Runtime.dll,Antlr3.StringTemplate.dll和Antlr3.Runtime.Debug.dll合并为一个DLL Antlr3.StringTemplate.dll

这删除了所有DLL冲突,我能够包含nhibernate需要的Antlr3.Runtime.dll。生产stringtemplate的人也应该这样分发他的包。