什么是AppDomain?

时间:2009-02-22 10:37:33

标签: c# .net appdomain

什么是AppDomain? AppDomains有哪些好处或原因 微软带来了AppDomains的概念,没有AppDomains会出现什么问题?

请详细说明。

3 个答案:

答案 0 :(得分:114)

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

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

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

See MSDN了解更多信息。说实话,这不是你需要经常搞砸的东西。

答案 1 :(得分:45)

App-domain实现了连续虚拟内存空间的概念,该空间包含可以直接访问或引用的代码和内存资源。

单独的AppDomains不共享内存空间,因此,一个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进程堆。

答案 2 :(得分:33)

可以将AppDomains视为轻量级进程。它们共享许多相同的过程特征,例如他们有自己的静力学,装配等副本,但它们包含在一个过程中。从操作系统的角度来看,无论可能包含多少个AppDomain,流程都只是一个流程。

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

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