我有一个应用程序,它使用.NET Remoting在另一个AppDomain中加载插件(在同一个进程中)。这样做是因为插件必须是可卸载的。
我不时在主应用程序域中获得插件appdomain中的远程对象(从MarshalByRefObject
继承)被垃圾收集的异常。由于我控制插件和应用程序本身的代码,我可以修改双方的代码以寻找解决方案。
第一个想法是为这些对象提供无限租约。这样可行,但仅适用于一些始终存在的全局对象。其他对象可能变得非常耗费内存,我实际上想要来垃圾收集它们 - 当然主要的应用程序域完成它们时,当然。
一种可能的解决方案是实现IDisposable
并切换到为已处置对象返回过期租约。然而,这需要我努力Dispose()
我曾经使用过的所有这些对象的实例。相当多的代码可以解决并修复。
所以我想知道是否还有其他方法?我尝试实现Finalizer,但这似乎只在远程appdomain上运行,无论对象是由值还是引用编组。有没有办法检测到本地包装器即将被垃圾收集,然后以某种方式将远程对象标记为“可以自由进行垃圾收集”?