我知道这个问题似乎在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
答案 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的人也应该这样分发他的包。