多个AppDomain之间的交互。破坏单例对象的问题

时间:2010-03-25 06:42:27

标签: c# remoting appdomain marshalbyrefobject

问题如下。有一个应用程序正在创建其他AppDomain并在那里加载程序集(自定义用户脚本)。 在主应用程序中,有一些对象,将所有权转移到创建AppDomain的对象。 对象本身是MarshalByRefObject,它们被禁用了lifetimeservices(InitializeLifetimeService返回null)。

所有这一切都有效。但是,这些AppDomain是被创建和销毁的......由于卸载域而导致的破坏以及对创建对象的引用都被遗忘了。

一般情况下,由于渐进的内存结束,因为这些“被遗忘”的对象似乎没有被释放,尽管它​​们在任何地方都没有链接,而且AppDomain(它们是链接)早已被卸载......

因此问题 - 错误在哪里?怎么了?卸载域后为什么不免除设施?

没有人想到 - 为每个加载的域都考虑到自己的这些对象的链接,并在他卸载之后 - 导致每个对象RemotingServices.Disconnect(...)。当生命周期服务不可用时,可能需要做什么?

1 个答案:

答案 0 :(得分:1)

我会做出以下更改:

为这些类型实施IDisposable和ISponsor。覆盖这些类型的InitializeLifetimeService方法,而不是返回null,使每个实例成为自己的赞助商。

这些类型应该从Renewal返回一个积极的TimeSpan,直到它们被处理掉。只需确保在销毁appdomain之前处置它们。