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

GT.*_*GT. 17 c# assemblies appdomain multiple-versions

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

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

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

k3b*_*k3b 14

如果两个程序集兼容,则可以在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>
Run Code Online (Sandbox Code Playgroud)

dotnet 1.0的这个配置条目告诉asembly loader总是使用版本1.0.3300.0,无论编译到调用exe中的是什么.新的dotnet版本也是如此


wag*_*ghe 5

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

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

第三方库引用不同版本的log4net.dll

答案是指这个链接:

在同一文件夹中使用同一程序集的不同版本

在此线程中,有关于在同一上下文中加载同一程序集的不同版本并在MSDN上引用此链接的注意事项:

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

这是另一个答案建议使用AssemblyResolve: 引用两个相等的程序集,只有公钥不同


L-F*_*our 1

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

无论如何,如果您想加载两个版本,则必须在两个单独的应用程序域中执行此操作,因为这样您就可以随后卸载不需要的版本。然后,您可以在正确的应用程序域中执行逻辑,如如何创建应用程序域并在其中运行我的应用程序中所述?