不知怎的,我很幸运,从来没有处理过这个问题,尽管我认为这是一个常见的问题:
我有一个网络项目,我们称之为SomeProject
。 SomeProject
引用了第三方库,我们称之为SomeThirdParty
,版本1.0。 SomeProject
也引用了本土类库,我们称之为SomeLibrary
。 SomeLibrary
也引用了SomeThirdParty
,但是引用了另一个版本(比方说2.0)。
SomeThirdParty
版本1.0和2.0共享大多数相同的签名,但它们是不同的实现。我需要SomeProject
使用1.0实现,SomeLibrary
使用2.0实现。如果可能的话。
我使用对log4net的引用编译SomeProject
。最终在bin目录中的DLL是SomeProject
引用的DLL。在运行时,当SomeLibrary
的代码运行时,它会尝试执行SomeThirdParty
版本2.0中的代码,当然会失败,抛出FileLoadException: Could not load file or assembly '
SomeThirdParty , Version=2.0.0.0, Culture=[etc.]' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.
显然我可以将SomeProject
升级到较新的DLL或将SomeLibrary
降级到较旧的DLL,但由于很多原因它不是理想的。
我认为正确的答案涉及在GAC中安装SomeThirdParty,但我不确定我将如何做到这一点,以及它将如何影响其他开发人员和服务器。
我们对您提出的任何建议表示赞赏。
感谢您的帮助。
答案 0 :(得分:6)
将两个版本的SomeThirdParty放入GAC应该可以做你想要的。使用gacutil实用程序或Start-> Run->程序集然后拖放。
答案 1 :(得分:3)
从我之前的回答:https://stackoverflow.com/a/19576769/2367343
我昨天遇到了使用Oracle.DataAccess.dll的Visual Studio Web开发人员。
我的解决方案,
右键单击您的项目(* .csproj)并进行编辑。
正下方:
<PropertyGroup>
放置
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
然后重建您的解决方案。在包含它们时,您必须将两个版本dll分成项目中的两个不同目录(必需)。
我做了
ora11 >> Oracle.DataAccess.dll (Version 11)
ora9 >> Oracle.DataAccess.dll (Version 9)
执行此操作允许IDE使用两个版本的DLL。