卸载插件在Mono中泄漏程序集

本文关键字:泄漏 程序集 Mono 插件 卸载 | 更新日期: 2023-09-27 18:06:14

我正在实现一个插件系统,它允许它们被重新加载而无需重新启动主机进程。在。net 4.5中一切都可以完美地工作,但在Mono 3.2.7中运行时,插件程序集会泄漏到主机AppDomain中,并且插件无法更改。

当调用AppDomain.CreateInstanceFromAndUnwrap在插件程序集中创建类型的实例时,程序集被加载到主机AppDomain中。这应该不会导致问题,因为该类型继承MarshalByRefObject并共享一个公共接口。

您可以在这里看到我的代码:https://github.com/Rohansi/PluginTest导致程序集泄漏的行在这里。

卸载插件在Mono中泄漏程序集

我找到了一个解决这个问题的方法。我已经用修复更新了Github repo,但我将在这里总结一下。

为了防止程序集泄漏到主机AppDomain,程序集必须不在运行时将搜索它的位置之一。您要么需要在子目录中加载它,要么需要在不同的文件名下加载它。程序集将不再自动加载到主机AppDomain,但在重新加载时它开始崩溃。

我通过用这个方法替换CreateInstanceFromAndUnwrap调用来修复这个崩溃。PluginBridge实例仍然是用CreateInstanceFromAndUnwrap创建的。

在这一切之后,似乎我有工作插件重新加载在。net和Mono(在3.4中测试)。