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

19

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

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

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

4个回答

16
如果两个程序集兼容,您可以在 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>

这个针对 .NET 1.0 的配置项告诉程序集加载器始终使用版本号为 1.0.3300.0 的程序集,而不管调用 exe 中编译了什么版本。新版的 .NET 也可以实现同样的功能。


我该如何告诉它加载新版本或旧版本? - Alex
@Alex,我不明白你的问题。你想要实现什么?newVersion=1.0.0.0 表示使用旧版本 1.0.0.0。 - k3b

6
以下是关于如何加载同一程序集的多个版本的几篇来自SO的帖子:
这篇文章描述了如何引用两个不同版本的log4net。请参见@Joe B.在被接受的答案下的评论,以获取有关他如何解决问题的详细信息。 第三方库引用不同版本的log4net.dll 该答案提到了这个链接: 在同一个文件夹中使用不同版本的同一程序集 在这个线程内,有一个警告,指出在相同的上下文中加载不同版本的同一程序集,并引用MSDN上的这个链接。

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

这里有一个关于使用AssemblyResolve的答案,建议使用它来解决两个相等但公钥不同的程序集引用问题: 引用两个公钥不同但相等的程序集


0

如果你有同一组件的两个不同版本,那么这意味着这两个版本不仅在实现上可能不同,而且暴露的操作数量也可能不同?如果是这样,如果某些功能只存在于其中一个版本中,如何切换版本?

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


-1

这是一个仅包含链接的答案 - 如果链接失效,答案将不包含任何有用信息。请参阅其他地方只包含链接的答案真的是“好答案”吗?当答案不是答案时:你的答案在另一个城堡里?获取更多信息。 - Wai Ha Lee

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