【问题标题】:What is AppDomain? [duplicate]什么是应用域? [复制]
【发布时间】:2010-10-09 03:36:59
【问题描述】:

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

请详细说明。

【问题讨论】:

标签: c# .net appdomain


【解决方案1】:

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

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

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

See MSDN 了解更多信息。老实说,这不是你需要经常搞砸的事情。

【讨论】:

  • 要提一点(但很重要)的事情:AppDomains 不涵盖线程。
  • @RüdigerStevens 你是什么意思??
  • @AgentFire:如果某些代码在某个线程中运行并且某些 AppDomain 从另一个 AppDomain 调用代码,则该线程“越过”AppDomain 边界并从另一个 AppDomain 运行代码。所以线程不属于特定的 AppDomains ......尽管可以说线程“属于”创建它的代码来自的域。但是一个线程可以运行来自任何 AppDomain 的代码。
  • @RüdigerStevens 这实际上是一个优势。
  • 正如@Marc 所指出的,将 AppDomain 视为额外的隔离层是个好主意。我想把它放到一个上下文中:[Process > CLR > AppDomain > Assembly with statics > Thread with stack]。这意味着一个进程托管一个公共语言运行时 (CLR)。 CLR 有一个或多个 AppDomain。每个 AppDomain 加载一个或多个程序集。每个程序集都有自己的静态变量和一个或多个线程。每个线程都有自己的堆栈。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 好吧,我对你的声明 Separate AppDomains do not share memory space 和@Brian Rasmussen AppDomains 是同一进程的一部分,因此实际上共享有点困惑同一个托管堆。你能澄清一下吗?
  • 当 AppDomain 是同一个 Windows 进程的一部分(因此在同一个 .Net 运行时实例中)时,它们必然位于所述 Windows 进程的同一个托管堆中;但是,这种情况对于 .Net 应用程序通常是不可见的。请记住,.Net 应用程序不是 Windows Process 应用程序,它实际上运行在一种虚拟机中。
  • 这需要更多的投票。一切都解释得很好。
【解决方案3】:

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

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

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

【讨论】:

  • 只有一个音符。内部字符串似乎没有在不同的 AppDomains 之间共享
猜你喜欢
  • 2023-03-30
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多