我正在尝试在C#中实现一个插件框架,其中每个插件都在自己的AppDomain
中加载。我遇到的问题似乎是AppDomains
之间的远程处理层是垃圾收集我的插件实例。每个插件都继承自这个类:
public class PluginRefObject : MarshalByRefObject{
public override object InitializeLifetimeService() {
return null;
}
}
我认为这会给对象带来无限的生命。但是,插件似乎有点工作,然后突然我得到一个RemotingException
,并显示错误消息:
Object 'longhexstring.rem' has been disconnected or does not exist at the server
其中,从谷歌搜索,我相信GC已经删除了我的远程对象。我是否必须做其他事情来保持这个物体的活力?
答案 0 :(得分:0)
事实证明,我的插件中抛出了异常,导致AppDomain被卸载。
虽然这是一个棘手的错误。我的插件注册了一个TcpChannel
,我希望TcpChannel
通过ChannelServices.UnregisterChannel()
断开连接。显然,运行该频道的线程仍在继续,并且在下次尝试访问该频道时异步抛出ObjectDisposedException
。
在谷歌搜索之后,似乎没有干净的方法来杀死TcpChannel,而我找到的用于清理另一个AppDomain
中的频道的最佳解决方案就是卸载AppDomain