异常描述
最近参与的项目中使用了AppDomain,AppDomain是一组程序集的逻辑容器,详细的介绍可以读这篇文章:
AppDomain
其中碰到一个bug,一个AppDomain对象被创建并使用5分钟后,整个程序崩溃了。
相关代码片段
PluginLoader中:
PluginHost中:
原因:
CLR为跨APPDomain访问的对象代理使用了一个“租约管理器”。一个对象的代理创建好之后,CLR保持对象存活5分钟。如果5分钟之内没有通过代理发出调用,对象就会失败,下次垃圾回收会释放它的对象。每发出一次对象的调用,“租约管理器”都会续订对象的租期,保证它在接下去的2分钟内在内存中保持存活。如果在对象过期之后试图通过一个代理调用它,CLR会抛出一个RemotingException。
默认的5分钟和2分钟的租期设定可以修改的,你只需要重写MarshalByRefObject的虚方法InitializeLifetimeServices即可。