我实现了一个插件系统,允许在不重新启动主机进程的情况下重新加载它们。在.NET 4.5中,一切都运行良好,但在Mono 3.2.7中运行时,插件程序集会泄漏到主机AppDomain中,并且插件无法更改。
在调用AppDomain.CreateInstanceFromAndUnwrap
时,程序集会加载到主机AppDomain中,以在插件程序集中创建类型的实例。这不应该导致问题,因为类型继承MarshalByRefObject
并共享一个公共接口。
您可以在此处查看我的代码:https://github.com/Rohansi/PluginTest导致程序集泄漏的行是here。
答案 0 :(得分:0)
我找到了解决此问题的方法。我已经用修复程序更新了Github仓库,但我会在这里总结一下。
为了防止程序集泄漏到主机AppDomain中,程序集不能位于运行时将搜索它的位置之一。您需要将其加载到子目录中或以不同的文件名加载它。程序集将不再自动加载到主机AppDomain中,但在重新加载时会开始崩溃。
我通过用this method替换CreateInstanceFromAndUnwrap
来电来解决此问题。仍然使用CreateInstanceFromAndUnwrap
创建了PluginBridge实例。
毕竟这看起来我在.NET和Mono中都重新加载了插件(在3.4中测试过)。