如何解决 Antlr3 依赖地狱问题

19

我有一个带有MEF和RavenDB的asp.net MVC 4项目。

当项目加载时,它会抛出此异常:无法加载文件或程序集Antlr3.Runtime.dll

我发现RavenDB和WebGrease(与MVC 4一起安装)都使用Antlr3。但是WebGrease附带了自己的Antlr3 dll,由Microsoft签名 - PublicKeyToken 31bf3856ad364e35。

Antlr3默认的PublicKeyToken为eb42632606e9261f。

RavenDB和WebGrease使用相同版本的Antlr3 3.3.1.7705。

如何解决这个问题?


1
RavenDB 将很快移除 Antlr3 依赖。 - Ayende Rahien
@ayende-rahien 感谢您提供的信息。不幸的是,如果我的另一个依赖项依赖于Antlr3,我将遇到相同的问题。我的意思是,这个问题不是由RavenDB引起的,而是WebGrease使用自己编译版本的Antlr3引起的。 - W3Max
3个回答

7

很遗憾,我未找到解决具有不同签名的相同版本的依赖项冲突的方法。

但好消息是WebGrease的一位贡献者Howard Dierking已通过电子邮件回答了我的问题。以下是他的回复:

嗨Maxime-很抱歉你遇到了这个问题。 我正在努力做一些事情来快速解决问题:

1)准备一个带有最新antlr版本的更新包-将进行测试并推送到nuget.org

2)与WebGrease团队合作更改其NuGet包,使其不再发布antlr.dll,而是采用软件包依赖关系-在与他们交谈时,他们不知道存在一个包。

这应该可以解决您遇到的dll hell问题。 希望这不会耗费太多时间,因为有假期。

谢谢,

_howard


目前正在经历同样的事情。你解决了吗?我的WebGrace版本为1.3.0(来自Nuget的最新版本),我的Antlr3.Runtime版本为3.3.1.7705(来自Nuget)。 - angularrocks.com

1
我遇到了相同的问题,并通过从计算机中删除所有项目、从服务器获取最新版本并在项目加载后重新构建所有NuGet依赖项来解决它。 你可以尝试这个方法,对我有效。 似乎一些NuGet依赖项在被卸载后留下了一些垃圾,这是清洁地重建整个解决方案的唯一方法。

1
我尝试了其他答案。我还尝试了许多恢复、升级、降级、重新安装WebGrease和Antlr包的组合。在运行时,我仍然会得到ReflectionTypeLoadException异常,其中LoaderExceptions显示了已被替换的旧Antlr版本号(3.4.1.9004)。
我还尝试了以下方法,测试了几天,但都没有解决问题:
- 清除临时文件。 - 重新加载Visual Studio和解决方案。 - 重启我的开发计算机。 - 在引用上移除“特定版本”标志。
最后起作用的是在web.config文件中添加一个绑定重定向。由于旧版WebGrease也没有通过NuGet更新,因此我将它们两个都替换为:
</runtime>
    </assemblyBinding>
        <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

重新编译和部署应用程序后,它消除了投诉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接