什么是AppDomain?

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

请详细说明。

AppDomain在进程中提供了一个隔离层。 一切你通常认为“每个程序”(静态variables等)实际上是每个AppDomain。 这对于:

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

痛苦是你需要使用远程等

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

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

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

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

这种架构的一个显着优点是,无论AppDomain处于相同的进程,不同的进程还是不同的计算机上,应用程序域之间的通信模式基本保持不变:即参数数据的序列化和反序列化(编组) 。

注1:穿过AppDomain的线程的含义是阻塞或同步方法调用另一个AppDomain(相对于非阻塞或asynchronous调用,这会产生另一个线程继续在目标AppDomain中执行并继续在当前的AppDomain无需等待回应)。

注2:有线程本地存储这样的东西。 然而,更好的名字应该是App-Domain线程本地存储,因为线程在跨App-Domains时将数据留在后面,但在返回时将其选回: http : //msdn.microsoft.com/en-us/library /6sby1byh.aspx

注3:.Net Runtime是一个具有关联堆的Windows Process应用程序。 它可能在该堆中托pipe一个或多个AppDomain。 但是,AppDomain的devise是互不理睬,通过编组来相互沟通。 可以想象的是,可以执行优化来绕开通信AppDomain之间的封送,共享相同的.Net运行时并且因此具有相同的Windows进程堆。

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

不像一个进程,但是一个AppDomain没有任何线程,除非你明确地创build它们。 线程可以在任何AppDomain中运行代码。

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