加载同一程序集的多个版本

时间:2010-12-15 14:55:10

标签: c# assemblies appdomain multiple-versions

我正在使用第三方程序集,不幸的是我现在需要将他们的最新版本和之前版本加载到我的项目中,因此在运行时我可以决定加载哪一个。我只需要一个,而不是两个。

考虑到这一点,我也依赖于组件提供的类型,因此我不能每次为我想要使用的方法/事件/接口从反射和查询加载。我已经看到一些提及通过AppDomain来处理这个问题,但我不确定如何继续处理。

进程是针对组件的一个版本进行编码,然后在运行时(使用AppDomain)交换我希望使用的正确DLL吗?所以我只会在启动时处理这个问题?

4 个答案:

答案 0 :(得分:12)

如果两个程序集兼容,您可以在app.exe.config或web.config文件中定义,以通过声明bindingRedirect来始终使用新版本。

例如

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705">
        <dependentAssembly>
            <assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/>
            <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/>
        </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

dotnet 1.0的这个配置条目告诉asembly loader总是使用版本1.0.3300.0,无论编译到调用exe中的是什么。新的dotnet版本也可以实现相同的目标

答案 1 :(得分:5)

以下是SO上的一些帖子,描述了如何加载同一程序集的多个版本:

这篇文章描述了如何引用两个不同版本的log4net。请参阅@Joe B.在接受的答案下的评论,详细了解他如何解决他的问题。

3rd party libraries refer to different versions of log4net.dll

答案是指这个链接:

Using different versions of the same assembly in the same folder

在这个帖子中,有一个注意事项是在同一个上下文中加载同一个程序集的不同版本,并在MSDN上引用这个链接:

http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

这是另一个建议使用AssemblyResolve的答案: Reference two equal assemblies, only public keys differ

答案 2 :(得分:0)

如果您有相同组件的两个不同版本,那么这意味着两个版本不仅在实现方面有所不同,而且在它们公开的操作数量方面也有所不同?如果是这种情况,如果某些功能仅属于两个版本之一,那么如何切换版本?

无论如何,如果你想加载这两个版本,你必须在两个独立的应用程序域中进行加载,因为这样你就可以卸载之后不需要的版本。然后,您可以在正确的应用程序域中执行逻辑,如How do I create an application domain and run my application in it?

中所述

答案 3 :(得分:0)

有一个包含解决方案here的博客条目,也参考此SO帖子Loading different versions of the same assembly