什么是AppDomain?AppDomains的好处是什么?为什么微软带来了AppDomains的概念,没有AppDomains会出现什么问题?
请详细说明.
An AppDomain
在进程内提供一层隔离.您通常认为"每个程序"(静态变量等)的所有内容实际上都是每个AppDomain.这对以下内容很有用:
插件(你可以卸载的AppDomain
,但不是一个组件内的AppDomain
)
安全性(您可以运行一组具有特定信任级别的代码)
隔离(你可以运行不同版本的程序集等)
痛苦是你需要使用远程处理等.
有关详细信息,请参阅MSDN.说实话,这不是你需要经常搞砸的东西.
App域实现了连续虚拟内存空间的概念,该空间保存代码和可以直接访问或引用的内存资源.
单独的AppDomain不共享内存空间,因此,一个AppDomain无法直接引用另一个AppDomain中的内容.特别是,必须通过逐个值的过程在AppDomains之间传递数据.特别是,依赖于指针并因此依赖于内存地址的引用对象必须首先从源序列化,然后反序列化到目标AppDomain中.
以前在Windows系统上,内存边界由进程实现; 但是,构建流程是资源密集型的.它们还具有作为线程边界的双重用途.另一方面,应用域仅涉及存储器边界或地址空间.线程可以在AppDomains上"流动"(也就是说,一个过程可以调用另一个AppDomain中的入口点并等待它返回.该线程被称为在另一个AppDomain中'继续'执行.
这种架构的一个显着优点是App域的通信模式基本保持不变,无论AppDomain是在同一个进程,不同进程,还是在不同的机器上,即:参数数据的序列化和反序列化(编组)过程.
注1:跨越AppDomain的线程的含义是对另一个AppDomain的阻塞或同步方法调用的意义(相对于非阻塞或异步调用,这将产生另一个线程以继续在目标AppDomain中执行并继续在其当前的AppDomain中没有等待回应).
注2:有线程本地存储这样的东西.但是,更好的名称应该是App-Domain线程本地存储,因为线程在跨越App-Domains时会将数据留下,但是当它们返回时会将它们备份:http://msdn.microsoft.com/en-us/library /6sby1byh.aspx
注3:.Net Runtime是一个带有关联堆的Windows Process应用程序.它可以在该堆中托管一个或多个AppDomain.但是,AppDomains的设计是彼此无视,并通过编组进行相互通信.可以想象,可以执行优化,绕过共享相同.Net运行时的通信AppDomain之间的编组,从而绕过相同的Windows进程堆.
AppDomains可以视为轻量级进程.它们共享许多相同的过程特征,例如它们有自己的静态,装配等副本,但它们包含在一个过程中.从操作系统的角度来看,无论可能包含多少个AppDomain,流程都只是一个流程.
但是,与进程不同,AppDomain没有任何线程,除非您明确创建它们.线程可以在任何AppDomain中运行代码.
AppDomains是同一进程的一部分,因此实际上共享相同的托管堆.这通常不是问题,因为AppDomain编程模型阻止了AppDomain之间的隐式访问.但是,某些引用实际上是在AppDomains之间共享的,例如类型对象和实习字符串.