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

什么是.NET应用程序域?

  •  78
  • Luke  · 技术社区  · 16 年前

    尤其是,在两个不同的应用程序域中运行代码意味着什么?

    数据通常如何通过应用程序域边界传递?它是否与通过流程边界传递数据相同?我很想知道关于这个抽象的更多信息,以及它对什么有用。

    编辑: AppDomain类的良好现有覆盖范围 I don't understand Application Domains

    4 回复  |  直到 16 年前
        1
  •  72
  •   Reed Copsey    16 年前

    AppDomain 基本上提供了一个独立的区域,其中代码在进程内部运行。

    一个简单的方法来考虑它几乎是一个重量较轻的过程坐在你的主要过程。每个AppDomain都存在于一个完全隔离的进程中,它允许您安全地运行代码(如果需要,可以在不破坏整个进程的情况下卸载代码),并具有单独的安全性等。

    至于您的具体情况——如果您在一个进程中的两个不同的AppDomain中运行代码,那么代码将单独运行。AppDomain之间的任何通信都将通过MarshallByRefObject进行序列化或处理。在这方面,它的行为非常类似于使用远程处理。这提供了大量的安全性——您可以运行您不信任的代码,如果它出错,它将不会影响您。

    在msdn关于 Application Domains .

        2
  •  19
  •   nikmd23    16 年前

    它是.NET运行时提供的隔离层。因此,应用程序域在一个进程中(1个进程可以有多个应用程序域),并有自己的虚拟地址空间。

    应用程序域很有用,因为:

    • 它们比完整的流程便宜
    • 它们是多线程的
    • 在这个过程中你可以不杀死任何东西就阻止一个
    • 资源分离/配置等
    • 每个应用程序域都在自己的安全级别上运行
        3
  •  1
  •   Ziaullah Khan    11 年前

    如果从处理器内部细节的角度来看,它会为代码段(CS)寄存器设置不同的值。code和cs:ip(指令指针)寄存器是处理器正在执行的寄存器。

    (为了简洁起见,我选择了浏览与表格相关的讨论)。

    AppDomain标记此边界。为了代码安全。

    提供这种背景的原因是为了回避这类问题: 1.我们如何在两个应用程序域之间访问资源(是的,使用管道或其他共享机制,而不是直接作为cs:ip设置为其他应用程序域)。只有操作系统能做到这一点。不是clr)

    1. 应用程序域中是否有多个线程。技术上是的,因为CS值将在当前过程中。您可以通过跳转语句(函数调用/goto组合)将IP更改为其他内容。

    2. 两个不同应用程序域中的两个线程是否可以通信(不可以,请参阅第1点。)

    3. 单个应用程序域中的两个线程能否通信(是。参考点2)

    对cs:ip的工作原理知之甚少,可以回答这些案例的其他几种组合。

        4
  •  0
  •   Bidou Varun Chhangani    11 年前

    在一个进程中运行的每个应用程序,AppDomain也是一个轻量级的进程,或者我们可以说逻辑单元,它具有一组程序集(这是一个包含程序集组的容器),并且它存在于同一进程的隔离级别的进程中,这允许在同一进程中运行多个程序集并阻止它们直接进入。

    在AppDomain中运行DOT NET应用程序: 一旦任何一个点网应用程序运行,操作系统shell会将clr加载到一个进程中,并在同一进程中创建新的appdomain,然后从appdomain代码中加载创建的appdomain中的所有程序集。

    何时自定义AppDomain: 我们可以创建自己的AppDomain,现在的情况是我们可以在哪个场景中创建自己的AppDomain。假设运行时我们需要在不中断正在运行的应用程序的情况下添加或删除程序集,那么我们可以创建自己的AppDomain。