加载相同程序集的多个版本
我正在使用第三方程序集,不幸的是我现在需要加载他们的最新和以前的版本到我的项目中,所以在运行时我可以决定加载哪一个。 我只需要一个,而不是两个。
考虑到这一点,我也依赖于组件提供的types,所以我不能从reflection加载和每次查询我想要使用的方法/事件/接口。 我已经看到一些通过AppDomain
处理这个提到,但不知道如何继续。
该进程是针对组件的一个版本进行编码,然后在运行时(使用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的这个configuration项告诉安装程序加载程序总是使用版本1.0.3300.0,无论编译到调用exe文件中。 新的dotnet版本也是一样的
下面是从这里的几个post,介绍如何加载同一程序集的多个版本:
这篇文章描述了如何引用两个不同版本的log4net。 请参阅@Joe B.在接受的答案下的评论,了解他是如何解决他的问题的。
第三方库指的是不同版本的log4net.dll
这个答案是指这个链接:
在同一文件夹中使用相同程序集的不同版本
在此线程中,在同一个上下文中加载相同程序集的不同版本并在MSDN上引用此链接时需要注意:
http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions
这里是另一个答案,build议使用AssemblyResolve: 引用两个平等的程序集,只有公钥不同
如果同一个组件有两个不同的版本,那么这意味着这两个版本不仅在实现上有所不同,而且在它们暴露的操作的数量上也会有所不同。 如果是这种情况,如果某些function只有两种版本中的一种,那么如何切换版本?
无论如何,如果你想加载这两个版本,你将不得不在两个独立的应用程序域中执行它,因为那样你可以卸载之后不需要的那个。 然后,您可以在正确的应用程序域中执行您的逻辑,如“ 如何创build应用程序域并在其中运行我的应用程序”中所述。 。
在这里有一个解决scheme的博客条目,也可以参考这个SO线程加载相同程序集的不同版本