什么是 应用程序域名? AppDomain 的好处是什么? 为什么 微软带来了应用域的概念,没有应用域的问题是什么?
请详细说明。
AppDomain在进程中提供一个隔离层。您通常认为的“ per program”(静态变量等)实际上是 per-AppDomain。这对以下情况很有用:
AppDomain
痛苦的是你需要使用远程等。
更多信息请参见 MSDN 。
AppDomain 可以被视为轻量级进程。它们共享一个进程的许多相同特征,例如,它们有自己的静态副本、程序集等等,但它们包含在一个进程中。从操作系统的角度来看,一个进程只是一个进程,无论它可能包含多少应用程序域。
然而,与进程不同的是,AppDomain 没有任何线程,除非您显式地创建它们。线程可以在任何 AppDomain 中运行代码。
AppDomain 是相同进程的一部分,因此实际上共享相同的托管堆。这通常不是问题,因为 AppDomain 编程模型阻止 AppDomain 之间的隐式访问。但是,一些引用实际上是在 AppDomain 之间共享的,例如类型对象和实际字符串。
应用程序域实现了连续虚拟内存空间的概念,该空间保存可以直接访问或引用的代码和内存资源。
单独的 AppDomain 不共享内存空间,因此,一个 AppDomain 不能直接引用另一个 AppDomain 中的内容。特别是,数据必须通过按值复制过程在 AppDomain 之间传递。特别是,引用对象(依赖于指针,因此依赖于内存地址)必须首先从源序列化,然后反序列化到目标 AppDomain。
在 Windows 系统之前,内存边界是由进程实现的; 然而,构造进程是资源密集型的。它们还具有作为线程边界的双重用途。另一方面,应用程序域只关心内存边界或地址空间。线程可以在 AppDomain 之间“流动”(也就是说,过程可以调用另一个 AppDomain 中的入口点并等待它返回。这个线程被称为在另一个 AppDomain 中“继续”执行)。
这种体系结构的一个重要好处是,无论应用程序域处于相同的进程、不同的进程,还是在不同的机器上,应用程序域之间的通信模式基本上保持不变: 即参数数据的序列化和反序列化(编组)进程。
注1: 线程穿越 AppDomain 的意义就是对另一个 AppDomain 的阻塞或同步方法调用(相对于一个非阻塞或异步调用,它会产生另一个线程在目标 AppDomain 中继续执行,并在其当前 AppDomain 中继续执行,而不等待响应)。
注2: 存在线程本地存储这样的东西。然而,一个更好的名字应该是应用域线程本地存储,因为线程留下他们的数据,因为他们跨应用域,但回来时拿起他们: http://msdn.microsoft.com/en-us/library/6sby1byh.aspx
注3: A。NetRuntime 是一个具有关联堆的 WindowsProcess 应用程序。它可能在该堆中驻留一个或多个 AppDomain。然而,AppDomain 的设计是不考虑彼此的影响,并通过封送处理彼此进行通信。可以想象,可以执行一个优化,绕过共享相同的通信 AppDomain 之间的封送处理。NetRuntime,因此是相同的 Windows 进程堆。