从 Activator.CreateInstance() 处理实例

Posted

技术标签:

【中文标题】从 Activator.CreateInstance() 处理实例【英文标题】:Disposing Of An Instance from Activator.CreateInstance() 【发布时间】:2021-11-13 19:35:45 【问题描述】:

我有一个带有插件系统的软件,它使用 Assembly.Load() + Activator.CreateInstance() 加载 DLL。我遇到的问题是插件使进程保持打开状态,例如,如果我关闭主窗口,进程仍然在后台保持打开状态并且无法正确关闭。

我的问题是,是否可以删除/卸载由 Activator.CreateInstance() 创建的实例?我尝试将对象设置为 null 并按照另一个问题中的建议调用 GC.Collect() ,但这无济于事......

 async public void AddServerModule(Assembly module)
 
    Type type = module.GetType("ModularModule.ModularModule");
    object instance = Activator.CreateInstance(type, new object[]  this );
    ...
 

【问题讨论】:

IDisposable 那么你可以使用using 块,如果不是为什么不呢? 您是否建议让插件使用IDisposable? if(instance is IDisposable d) d.Dispose();(+ 异常处理等)。否则,强制type 实现一些接口,该接口扩展IDisposable 我从未听说过加载程序集保持进程运行。当这发生在我身上时,是因为我启动了一个线程,没有将其标记为后台线程并让它运行。这个程序集有什么特别时髦的地方吗? @JeremyLakeman 成功了,谢谢。 【参考方案1】:

我通过使插件成为一次性插件解决了这个问题,然后在 Dispose() 方法中调用 Close()。

【讨论】:

我建议改用using 块,这样可以正确处理异常

以上是关于从 Activator.CreateInstance() 处理实例的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从