AppDomain 中的对象被垃圾收集
Posted
技术标签:
【中文标题】AppDomain 中的对象被垃圾收集【英文标题】:Objects in AppDomain getting Garbage Collected 【发布时间】:2016-04-29 18:47:04 【问题描述】:我正在尝试在 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 已经删除了我的远程对象。我是否必须做其他事情才能让这个对象保持活力?
【问题讨论】:
可能的答案:***.com/a/6339701/1186321 是的,我看到了那个。链接不好,发布的 .chm 文件无法打开 道歉;我相信这可能会有所帮助:msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx @spectacularbob 我通过右键单击文件打开 .chm 文件,转到属性,然后单击“取消阻止”。在我这样做之前,我可以看到内容,但什么也没有(这很愚蠢,如果文件被阻止,我如何从文件中获取 any 信息?),但在解除阻止之后,我可以读取整个文件。 【参考方案1】:原来我的插件中抛出了一个异常,导致 AppDomain 被卸载。
不过,这是一个棘手的错误。我的插件注册了TcpChannel
,并且有一点我希望通过ChannelServices.UnregisterChannel()
断开TcpChannel
。显然,运行该通道的线程仍在运行,并在下次尝试访问该通道时异步抛出 ObjectDisposedException
。
谷歌搜索后,似乎没有干净的方法可以杀死 TcpChannel,而我发现在另一个 AppDomain
中清理频道的最佳解决方案就是卸载 AppDomain
【讨论】:
以上是关于AppDomain 中的对象被垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章