使用不同版本的引用DLL

时间:2011-05-26 01:00:31

标签: c# .net dll reference

不知怎的,我很幸运,从来没有处理过这个问题,尽管我认为这是一个常见的问题:

我有一个网络项目,我们称之为SomeProjectSomeProject引用了第三方库,我们称之为SomeThirdParty,版本1.0。 SomeProject也引用了本土类库,我们称之为SomeLibrarySomeLibrary也引用了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,但我不确定我将如何做到这一点,以及它将如何影响其他开发人员和服务器。

我们对您提出的任何建议表示赞赏。

感谢您的帮助。

2 个答案:

答案 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。