代码之家  ›  专栏  ›  技术社区  ›  Rohit

AppDomain是否等同于.NET代码的进程?

  •  13
  • Rohit  · 技术社区  · 17 年前

    我知道单独的进程将是实现它的好方法,我可以偶尔从长时间运行的进程重新启动它。

    可以改用AppDomain吗?如果标记正确,AppDomain线程是否为STA线程?它是否有自己的COM对象内存?卸载AppDomain是否等同于终止进程?

    2 回复  |  直到 16 年前
        1
  •  24
  •   Community Mohan Dere    9 年前

    AppDomain提供的隔离程度与进程不同。事实上,如果您担心第三方组件状态不好,就有可能导致.NET应用程序宕机。

    如果卸载时正在执行非托管代码,则无法卸载AppDomain,因此您可能很难控制AppDomain中的第三方代码。看见 http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx

    即使只针对托管代码,AppDomain也不提供健壮的沙箱解决方案。例如,如果加载的代码产生任何线程,则在出现未处理的异常时,这些线程将中断整个进程。这个问题有更多的信息: .NET - What's the best way to implement a "catch all exceptions handler" .

        2
  •  0
  •   Community Mohan Dere    9 年前

    AppDomain (应用程序域),是应用程序执行的隔离环境。

    它们有助于提供隔离, 卸载和安全边界 执行托管代码。

    • 使用应用程序域隔离可能导致流程中断的任务。 如果AppDomain的状态为 AppDomain可以在没有 当进程必须为运行时,此信息很重要 还可以使用应用程序域来 隔离不应共享的任务 数据

    • 当 进程正在运行。然而,如果你 打开第二个应用程序域以 加载并执行程序集 程序集被卸载时 应用程序域已卸载。使用 一组长期运行的进程

    可以运行多个应用程序域 在单一过程中;然而,有 应用程序域和线程。 多个线程可以属于一个线程 应用程序域,而 应用程序域,在任何给定时间, 应用程序域。

    我不会自称是AppDomain领域的专家,但我相当肯定,卸载AppDomain不会释放泄漏内存(即非托管内存)的COM对象。也许更熟悉这一点的人可以发表评论。

    正如Brian指出的,“.NET Framework 2.0版域中的…不保证卸载,因为可能无法终止正在执行的线程。”