使用不同版本的引用DLL

11
一些幸运的事情让我从未遇到过这个问题,尽管我认为这是一个常见的问题:
我有一个名为“SomeProject”的web项目,其中引用了第三方库“SomeThirdParty”版本1.0。 “SomeProject”还引用了自行开发的类库“SomeLibrary”。 “SomeLibrary”也引用了“SomeThirdParty”,但是是不同的版本(假设是2.0)。
“SomeThirdParty”的版本1.0和2.0共享大部分相同的签名,但实现不同。如果可能的话,我需要“SomeProject”使用1.0实现,“SomeLibrary”使用2.0实现。
我使用“SomeProject”参考log4net编译代码。最终在bin目录中生成的DLL是“SomeProject”的引用。运行时,当“SomeLibrary”中的代码运行时,它尝试执行来自“SomeThirdParty”版本2.0的代码,当然会失败,抛出“FileLoadException:无法加载文件或程序集'SomeThirdParty,Version = 2.0.0.0,Culture = [etc.]'或其某个依赖项。找到的程序集清单定义与程序集引用不匹配。”
显然,我可以将“SomeProject”升级到较新的DLL或将“SomeLibrary”降级为旧的DLL,但出于许多原因,这并不理想。
我认为正确的答案涉及在GAC中安装SomeThirdParty,但我不确定如何做到这一点以及它将如何影响其他开发人员和服务器。
欢迎您提供任何建议。
感谢您的帮助。
2个回答

6
将SomeThirdParty的两个版本都放入GAC中即可实现您想要的效果。使用gacutil工具或Start->Run->assembly,然后拖放即可。

2
这差不多是我想到的。我真的不想走这条路,因为这意味着所有开发人员的机器、所有服务器和任何新加入的开发人员都必须安装这些程序集到全局程序集缓存(GAC)中。但如果我们找不到其他选择,我会记住这个的。谢谢。 - Joe Enos

3

从我之前的回答中可以看到:https://dev59.com/_njZa4cB1Zd3GeqPdF1T#19576769

昨天我在使用 Oracle.DataAccess.dll 时遇到了这个问题,我的解决方案是:

右键单击您的项目(*.csproj)并进行编辑。

在下面:

<PropertyGroup>

地点
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

然后重新构建您的解决方案。在包含它们时,您必须将两个版本的dll分别放置在项目中的两个不同目录中(必需)。

我已经这样做了。

ora11 >> Oracle.DataAccess.dll (Version 11)

ora9 >> Oracle.DataAccess.dll (Version 9)

这样做可以让您的 IDE 使用两个版本的 DLL。


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