加载相同程序集的多个版本
我正在使用第三方程序集,不幸的是我现在需要将他们的最新版本和以前的版本加载到我的项目中,因此在运行时我可以决定加载哪一个版本。我只需要一个,而不是两个。加载相同程序集的多个版本
考虑到这一点,我也依赖于组件提供的类型,所以我无法从反射加载并且每次都查询我想要使用的方法/事件/接口。我看过一些提到通过AppDomain
来处理这个问题,但我不知道如何继续。
该进程是针对组件的一个版本进行编码,然后在运行时(使用AppDomain
)交换正确的DLL中我想要消耗的交换吗?所以我只会在启动时处理这个问题?
如果你有同一个组件的两个不同版本,那么这意味着这两个版本不仅在实现上有所不同,而且在它们公开的操作数量上也会有所不同。如果是这种情况,如果某些功能只有两种版本中的一种,您如何切换版本?
无论如何,如果你想加载两个版本,你将不得不在两个独立的应用程序域中执行它,因为那样你可以卸载之后不需要的那个。然后,您可以在正确的应用程序域中执行您的逻辑,如How do I create an application domain and run my application in it?中所述。
下面是从这里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
如果这两个组件都是兼容的,你可以在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本config条目告诉asembly装载机总是不管用版本1.0.3300.0什么被编译到调用exe文件。使用较新的dotnet版本也是可能的