【问题标题】:Using external assemblies: The located assembly's manifest definition does not match the assembly reference使用外部程序集:找到的程序集的清单定义与程序集引用不匹配
【发布时间】:2011-06-29 22:47:41
【问题描述】:

我知道这个问题似乎在 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 目录中,方法是在 Lib 项目中包含一个版本为 3.1.3.42154 的文件夹。 我告诉它总是复制,所以我得到 /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

【问题讨论】:

  • PublicKeyToken 不匹配会杀死它。使用最新的引用重新构建这些 DLL 就可以了。
  • 是的,我正要下载NHibernate的源代码并重新编译它以引用stringtemplate使用的DLL

标签: .net assemblies conflict assembly-references


【解决方案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-08-20
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多