【问题标题】:Objects in AppDomain getting Garbage CollectedAppDomain 中的对象被垃圾收集
【发布时间】: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 已经删除了我的远程对象。我是否必须做其他事情才能让这个对象保持活力?

【问题讨论】:

  • 是的,我看到了那个。链接不好,发布的 .chm 文件无法打开
  • 道歉;我相信这可能会有所帮助:msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx
  • @spectacularbob 我通过右键单击文件打开 .chm 文件,转到属性,然后单击“取消阻止”。在我这样做之前,我可以看到内容,但什么也没有(这很愚蠢,如果文件被阻止,我如何从文件中获取 any 信息?),但在解除阻止之后,我可以读取整个文件。

标签: c# garbage-collection appdomain


【解决方案1】:

原来我的插件中抛出了一个异常,导致 AppDomain 被卸载。

不过,这是一个棘手的错误。我的插件注册了TcpChannel,并且有一点我希望通过ChannelServices.UnregisterChannel() 断开TcpChannel。显然,运行该通道的线程仍在运行,并在下次尝试访问该通道时异步抛出 ObjectDisposedException

谷歌搜索后,似乎没有干净的方法可以杀死 TcpChannel,而我发现在另一个 AppDomain 中清理频道的最佳解决方案就是卸载 AppDomain

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多