0

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

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

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

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

我添加了

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

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

但这没有用。

我能做些什么来强制 pluginB 使用新版本的库?

4

1 回答 1

0

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

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

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

于 2021-07-28T13:22:29.980 回答