我正在使用第三方程序集,不幸的是现在我需要将他们的最新版本和之前的版本加载到我的项目中,以便在运行时决定加载哪个版本。我只需要一个版本,而不是两个。
考虑到这一点,我也依赖于组件提供的类型,因此我不能从反射中加载并每次查询我想要使用的方法/事件/接口。我看到有人提到可以通过 AppDomain
来处理这个问题,但不确定如何继续。
这个过程是编写针对组件的一个版本,然后在运行时(使用 AppDomain
)切换我想要被消耗的正确 DLL 的过程吗?所以我只在启动时处理这个问题吗?
我正在使用第三方程序集,不幸的是现在我需要将他们的最新版本和之前的版本加载到我的项目中,以便在运行时决定加载哪个版本。我只需要一个版本,而不是两个。
考虑到这一点,我也依赖于组件提供的类型,因此我不能从反射中加载并每次查询我想要使用的方法/事件/接口。我看到有人提到可以通过 AppDomain
来处理这个问题,但不确定如何继续。
这个过程是编写针对组件的一个版本,然后在运行时(使用 AppDomain
)切换我想要被消耗的正确 DLL 的过程吗?所以我只在启动时处理这个问题吗?
<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 也可以实现同样的功能。
http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions
这里有一个关于使用AssemblyResolve的答案,建议使用它来解决两个相等但公钥不同的程序集引用问题: 引用两个公钥不同但相等的程序集
如果你有同一组件的两个不同版本,那么这意味着这两个版本不仅在实现上可能不同,而且暴露的操作数量也可能不同?如果是这样,如果某些功能只存在于其中一个版本中,如何切换版本?
无论如何,如果您想加载这两个版本,您必须在两个单独的应用程序域中执行,因为然后您可以在之后卸载您不需要的那个。然后,您可以在正确的应用程序域中执行您的逻辑,如如何创建应用程序域并在其中运行我的应用程序?所述。
这里有一篇博客文章提供了解决方案在这里, 也可以参考这个SO线程加载同一程序集的不同版本
newVersion=1.0.0.0
表示使用旧版本 1.0.0.0。 - k3b