143

什么是AppDomain?AppDomains 的好处是什么,或者为什么微软提出了 AppDomains 的概念,没有 AppDomains 的问题是什么?

请详细说明。

4

3 回答 3

129

AnAppDomain在进程中提供了一层隔离。您通常认为“每个程序”(静态变量等)的所有内容实际上都是每个 AppDomain。这对于:

  • 插件(您可以卸载AppDomain,但不能卸载 中的程序AppDomain
  • 安全性(您可以运行一组具有特定信任级别的代码)
  • 隔离(您可以运行不同版本的程序集等)

痛苦是您需要使用远程处理等。

有关更多信息,请参阅 MSDN 。老实说,这不是你需要经常搞砸的事情。

于 2009-02-22T10:40:53.977 回答
53

一个应用程序域实现了一个连续的虚拟内存空间的概念,它保存了可以直接访问或引用的代码和内存中的资源。

单独的 AppDomain 不共享内存空间,因此一个 AppDomain 不能直接引用另一个 AppDomain 中的内容。特别是,数据必须通过按值复制过程在 AppDomain 之间传递。特别是,依赖于指针和内存地址的引用对象必须首先从源序列化,然后反序列化到目标 AppDomain。

以前在 Windows 系统上,内存边界是由进程实现的;然而,构建流程是资源密集型的。它们还具有作为线程边界的双重目的。另一方面,应用程序域只关心内存边界或地址空间。线程可以在 AppDomain 中“流动”(也就是说,一个过程可以调用另一个 AppDomain 中的入口点并等待它返回。线程被称为“继续”在另一个 AppDomain 中执行)。

这种架构的一个显着好处是应用域之间的通信模式基本上保持不变,无论应用域在同一进程中、不同进程中还是在不同机器上:即参数数据的序列化和反序列化(编组)过程.

注意 1:跨 AppDomain 的线程的含义是对另一个 AppDomain 的阻塞或同步方法调用(相对于非阻塞或异步调用,后者将产生另一个线程以继续在目标 AppDomain 中执行并在其当前 AppDomain 中继续执行无需等待回复)。

注2:有线程本地存储之类的东西。但是,一个更好的名称应该是 App-Domain Thread Local Storage,因为线程在跨 App-Domains 时将其数据留在后面,但在返回时将其取回:http: //msdn.microsoft.com/en-us/library /6sby1byh.aspx

注意 3:.Net 运行时是具有关联堆的 Windows 进程应用程序。它可能在该堆中托管一个或多个 AppDomain。但是,AppDomain 被设计为相互忽略并通过编组相互通信。可以想象,可以执行一种优化,绕过共享相同 .Net 运行时的通信 AppDomain 之间的封送处理,因此共享相同的 Windows 进程堆。

于 2012-09-02T03:09:47.983 回答
36

AppDomain 可以被视为轻量级进程。它们共享进程的许多相同特征,例如,它们有自己的静态、程序集等副本,但它们包含在单个进程中。从操作系统的角度来看,一个进程只是一个进程,不管它可能包含多少个 AppDomain。

然而,与进程不同的是,AppDomain 没有任何线程,除非您明确创建它们。线程可以在任何 AppDomain 中运行代码。

AppDomain 是同一进程的一部分,因此实际上共享相同的托管堆。这通常不是问题,因为 AppDomain 编程模型阻止了 AppDomain 之间的隐式访问。但是,一些引用实际上是在 AppDomain 之间共享的,例如类型对象和内部字符串。

于 2009-02-22T10:59:12.700 回答