如何以编程方式覆盖程序集绑定?

时间:2017-08-28 08:31:23

标签: c# .net appdomain assembly-binding-redirect

我有一个AppDomain托管插件架构。每个插件都安装在他们自己的文件夹中,以及他们需要的任何依赖程序集。在运行时,插件与可选的plugin.config文件一起实例化到它们自己的AppDomain中,它们可以用来指定程序集重定向等。

Host-Plugin通信的接口在My.API程序集中定义。主机应用程序有自己的My.API程序集,但插件很可能也会将My.API程序集捆绑为它们的依赖项。

只要这两个My.API程序集是相同版本就没有问题 - 但是如果主机应用程序使用较新版本的My.API程序集进行更新,则最好使用此向后兼容插件的My.API程序集。

有没有办法强制将主机安装的My.API程序集加载到插件应用程序域(并用于程序集绑定),而不是位于插件文件夹中的My.API程序集,该文件夹是定义的作为ApplicationBase的{​​{1}}?

通常的AppDomain事件在这里不起作用,因为只有当程序集绑定失败时才触发这些事件 - 在这种情况下,程序集绑定成功,但它将绑定到可能过时的程序集。

我可以强制使用AssemblyResolve加载正确的程序集,但是这不会填充程序集绑定缓存,在程序集绑定发生时仍会加载插件程序集。

我提出的一个选项是以编程方式将程序集重定向插入plugin.config以强制My.API作为版本9999.0.0.0加载。我希望这会导致AssemblyResolve事件,然后我可以使用正确的程序集版本来解决。但据我所知,插入重定向的唯一方法是物理修改plugin.config - 我想远离它。

是否有其他方法可以将特定汇编二进制文件强制应用到应用程序域中?

我想发布商政策可能能够解决这个问题,但不是那些需要GAC部署的人吗?目前,没有任何程序集部署到GAC中。可能安装了各种版本的应用程序,并且每个版本都应使用其特定版本的程序集。 GAC最终会强制v1.0应用程序以v2.0程序集结束 - 而v2.0应用程序中只有v1.0插件应该重定向到v2.0程序集。

(我们目前正在使用静态1.0.0.0汇编版本,因此只要我们可以重定向物理路径,就不会有不同的程序集标识。)

0 个答案:

没有答案