什么是.NET应用程序域?

特别是,在两个不同的应用程序域中运行代码有什么意义?

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

编辑:一般在AppDomain类的良好现有覆盖率, 我不明白应用程序域

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

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

至于你的具体情况 – 如果你在一个进程中的2个不同的AppDomain中运行代码,代码将独立运行。 AppDomain之间的任何通信都将被序列化或通过MarshallByRefObject处理。 它的行为非常像在这方面使用远程处理。 这提供了一个巨大的安全性 – 你可以运行你不信任的代码,如果它做错了什么,它不会影响你。

MSDN对应用程序域的描述中有更多的细节。

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

应用领域是有用的,因为:

  • 他们比整个过程便宜
  • 他们是multithreading的
  • 你可以停下来,而不会在这个过程中杀死所有的东
  • 资源分离/configuration/等
  • 每个应用程序域都运行在自己的安全级别上

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

(为了简洁起见,我select了浏览页表的相关讨论)。

AppDomain标记这个边界。 代码安全。

给出这种背景的原因是摆脱这样的问题:1.我们如何访问跨两个应用程序域的资源(是使用pipe道或其他共享机制不直接作为CS:IP不能被设置为一些其他的AppDomain。这只是操作系统,而不是CLR)

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

  2. 可以在两个不同的应用程序域进行通信(编号参照点1)

  3. 可以在单个应用程序域中的两个线程进行通信(是的,参考点2)

对这些案例的几个其他组合可以通过CS:IP如何工作的一点知识来回答。

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

在AppDomain内部运行DotNet应用程序:一旦任何DotNet应用程序运行,操作系统shell将CLR加载到一个进程中,并在同一进程中创build新的AppDomain,并加载创build的AppDomain中的所有程序集,现在将从AppDomain代码执行。

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