3

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

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

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

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

我尝试绑定重定向,但这不起作用,因为版本之间的 publicKeyToken 不同。它最终寻找具有与 3.1.3.42154 版本匹配的公钥令牌的 3.3.17705。

在 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() 显示版本已加载到应用程序域中,但是仍然错误提示找不到 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
4

1 回答 1

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 的人也应该以这种方式分发他的包。

于 2011-07-06T22:08:38.140 回答