【问题标题】:Common uses and best practices for application domains in .NET?.NET 中应用程序域的常见用途和最佳实践?
【发布时间】:2010-12-10 23:42:32
【问题描述】:

关于何时在应用程序中创建新的应用程序域有哪些指导方针和最佳实践?

此外,在一个应用程序中如何使用多个应用程序域的一些常见用途和示例有哪些?

【问题讨论】:

    标签: c# .net applicationdomain


    【解决方案1】:

    一个典型的例子是类似插件/插件的情况。它不仅可以让您在需要时卸载 DLL,还可以让您更好地控制插件可以执行的操作。

    此外,如果您创建要再次卸载的临时程序集(代码生成),这是一个很好的方法。 (LCG 只允许实现单个方法,如果你想实现一个完整的类,你需要将其发射到一个“真正的”程序集)。

    【讨论】:

      【解决方案2】:

      我见过的最常见的场景是能够提供与主程序不同的安全模型的可扩展性。

      在单独的 AppDomain 中加载插件允许两件事:

      1. 您可以实施更受限制的安全模型
      2. 您可以防止插件在您的应用程序出现问题时将其拆除

      AppDomain 的另一个很好的用途是加载和检查程序集。在单独的 AppDomain 中执行此操作允许您从单独的程序集中收集信息(或运行代码),然后从进程空间中卸载整个程序集。如果直接加载程序集,则无法卸载它。如果您希望能够在运行时将类型“升级”到新版本(即:加载远程程序集并稍后重新加载),这也很有用。

      【讨论】:

      • 我很确定将有缺陷的插件加载到单独的应用程序域中并不能防止插件崩溃您的应用程序 - 未处理的异常将使应用程序域崩溃并因此终止整个进程.
      • 这取决于你如何做事。可以设置一个应用程序域,因此将其拆除不会破坏该过程。请参阅msdn.microsoft.com/en-us/library/2bh4z9hs.aspx 上列出的第一个福利
      • 我不是在谈论应用程序域的受控终止 - 但如果任何线程导致未处理的异常,则无法阻止进程终止。 (如果有人能证明我错了,那就太好了,但我调查了当前项目中将应用程序的各个部分相互隔离的可能性,以便在子进程发生故障的情况下提高服务器的可靠性,因此我真的怀疑我错过了一个解决方案。)
      • Daniel:它有效,我已经做到了。从该链接“一个应用程序中的故障不会影响其他应用程序” - 如果您使用不安全或本机代码,那么这会超出窗口,但使用 100% 托管代码,您可以通过 AppDomains 提供一些安全性。
      • 它只是说明错误,而不是未处理的异常。也许我应该创建我的问题,询问一个例子......
      【解决方案3】:

      当您需要在应用程序中托管不可靠的第三方组件或您不信任它们(如插件)或希望能够卸载它们时,建议创建新域。

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 1970-01-01
        • 2010-11-14
        相关资源
        最近更新 更多