2011-06-29 97 views
3

我知道这个问题似乎回答了所有的stackoverflow和web,但我的问题是不同的。使用外部程序集:找到的程序集的清单定义与程序集引用不匹配

我想了解如何不使用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目录中,通过包含一个Lib项目和一个3.1.3.42154版本的文件夹。 我告诉它总是复制,所以我得到/bin/Lib/3.1.3.42154/Antlr.Runtime.dll 然后,我添加了一个探测元素来探测该目录。 这没有奏效,我得到了同样的确切错误。

如何使用引用另一个第三方程序集的第三方程序集,这两个引用都是不同的版本?

UPDATE:

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()表明版本的应用程序域加载的,但是,它仍然错误说thta 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 
+0

PublicKeyToken不匹配将其杀死。重新使用最新引用的这些DLL是您剩下的所有内容。 –

+0

是的,我正要下载NHibernate的源码并重新编译它以引用stringtemplate使用的DLL – BradLaney

回答

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冲突,并且我能够包含Antlr3。 nhibernate需要的Runtime.dll。生产stringtemplate的人也应该这样分发他的包。

相关问题