运行时程序集绑定重定向

Runtime assembly binding redirect

我有一个应用程序 pluginA,pluginA 执行 pluginB,pluginB 正在引用库并从中执行一些方法。

首先,我用 Assembly.Load(byte[]) 加载库,然后用 Assembly.Load(byte[]) 加载 pluginB,将程序集存储在内存中,然后创建启动 class 使用 Assembly.CreateInstance() 从存储的程序集中执行一些启动方法。

一切正常,直到我尝试在运行时更新库,我正在使用 Assembly.Load(byte[]) 加载新版本的库, 加载了新版本的库,创建了 pluginB 启动的新实例 class,但在执行时它使用的是旧版本的库。

我尝试使用 AppDomain.CurrentDomain.AssemblyResolve 事件,但在第一次加载库后,它再也不会被触发。

我加了

<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> 

对于 pluginA 和 pluginB 项目,我也在这些项目中将 SpecificVersion 属性 设置为 false。

但这没有用。

我该怎么做才能强制 pluginB 使用新版本的库?

经过一番研究,我最终采用了这种方法

有一个库 (https://github.com/0xd4d/dnlib) 可让您编辑程序集的元数据并在运行时使用编辑后的元数据编写新程序集(以及更多)。

加载 pluginB 后,当我需要更新库时,我正在加载新版本的库 Assembly.Load(bytes[]) 获取其新版本,之后使用 dnlib 我将 pluginB 的 assemblyRef 更改为引用新版本的库,并将新的 pluginB 程序集写入字节数组,然后使用 Assembly.Load(bytes[]) 重新加载它,之后 pluginB 将使用新版本的库。