我正在使用第三方程序集,不幸的是我现在需要将他们的最新版本和以前的版本加载到我的项目中,以便在运行时我可以决定加载哪个。我只需要一个,而不是两个。
考虑到这一点,我还依赖于组件提供的类型,因此我无法每次都从反射加载并查询我想要使用的方法/事件/接口。我已经看到有人提到通过AppDomain
s 处理这个问题,但不知道如何继续。
该过程是否会针对组件的一个版本进行编码,然后在运行时(使用AppDomain
)交换我想要使用的正确 DLL?所以我只会在启动时处理这个?
我正在使用第三方程序集,不幸的是我现在需要将他们的最新版本和以前的版本加载到我的项目中,以便在运行时我可以决定加载哪个。我只需要一个,而不是两个。
考虑到这一点,我还依赖于组件提供的类型,因此我无法每次都从反射加载并查询我想要使用的方法/事件/接口。我已经看到有人提到通过AppDomain
s 处理这个问题,但不知道如何继续。
该过程是否会针对组件的一个版本进行编码,然后在运行时(使用AppDomain
)交换我想要使用的正确 DLL?所以我只会在启动时处理这个?
如果两个程序集兼容,您可以在 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 的此配置条目告诉汇编加载程序始终使用版本 1.0.3300.0,无论编译到调用 exe 中的是什么。较新的 dotnet 版本也是如此
这里有几篇关于 SO 的文章,描述了如何加载同一程序集的多个版本:
这篇文章描述了如何引用两个不同版本的 log4net。有关他如何解决问题的更多详细信息,请参阅接受的答案下的@Joe B. 评论。
该答案是指此链接:
在此线程中,需要注意在同一上下文中加载同一程序集的不同版本,并在 MSDN 上引用此链接:
http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions
这是另一个建议使用 AssemblyResolve 的答案: 引用两个相等的程序集,只有公钥不同
如果您有同一个组件的两个不同版本,这是否意味着这两个版本不仅在实现上有所不同,而且在它们公开的操作数量上也可能不同?如果是这种情况,如果某些功能仅在两个版本之一中,您如何切换版本?
无论如何,如果您想加载这两个版本,则必须在两个单独的应用程序域中执行此操作,因为之后您可以卸载不需要的版本。然后您可以在正确的应用程序域中执行您的逻辑,如如何创建应用程序域并在其中运行我的应用程序?.
这里有一个解决方案的博客条目,也可以参考这个 SO thread Loading different versions of the same assembly