我有一个系统将程序集加载到appdomain中,然后将对象代理分发到其他域(基本上是一个简单的IoC容器)。我们需要实现非常高的正常运行时间,并且能够在运行时更新实现有助于实现这一点。
我没有遇到任何问题,因为我可以启动一个新的appdomain,将新程序集加载到其中,并开始将代理分发给好的新对象,同时当前执行的代码与旧对象一致。一切都很好,除了在某些时候我想卸载旧的appdomain。
有没有办法检查指向特定应用程序域中的对象的所有代理是否已超出范围,以便我可以安全地调用卸载而不会终止任何长时间运行的进程?
答案 0 :(得分:1)
如果代理是双向的,那么如果提供者appdomain在代理上调用方法来确定它是否仍处于活动/活动状态,那么这将是最简单的。应用程序域边界上的终身管理不是一个需要解决的简单问题,主要问题是您无法保证消费者应用程序域能够正常运行(例如,参考计数并不是一个很好的途径,尽管最明显。)
但是,如果所有代理都位于同一个进程中,您实际上可以依赖GC执行正确的终结,因此,您可以实现代理,以便代理实例上的Finalize()“回家”到提供者应用程序域让提供者知道代理不再存在。