当前位置:  开发笔记 > 编程语言 > 正文

什么是AppDomain?

如何解决《什么是AppDomain?》经验,为你挑选了3个好方法。

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

请详细说明.



1> Marc Gravell..:

An AppDomain在进程内提供一层隔离.您通常认为"每个程序"(静态变量等)的所有内容实际上都是每个AppDomain.这对以下内容很有用:

插件(你可以卸载的AppDomain,但不是一个组件AppDomain)

安全性(您可以运行一组具有特定信任级别的代码)

隔离(你可以运行不同版本的程序集等)

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

有关详细信息,请参阅MSDN.说实话,这不是你需要经常搞砸的东西.


一个小的(但很重要的)要提的是:AppDomains不包括线程.
@AgentFire:如果在某个线程中运行的某些代码和某个AppDomain从另一个AppDomain调用代码,则该线程"穿过"AppDomain边界并从该其他AppDomain运行代码.因此线程不属于特定的AppDomains ...虽然可以说线程"属于"域,但创建它的代码来自.但是一个线程可以从任何AppDomain运行代码.
正如@Marc指出的那样,将AppDomain视为额外的隔离层是一个好主意.我想把它放到一个上下文中:[Process> CLR> AppDomain> Assembly with statics> Thread with stack].这意味着进程托管公共语言运行时(CLR).CLR具有一个或多个AppDomain.每个AppDomain都会加载一个或多个程序集.每个程序集都有自己的静态变量和一个或多个线程.每个线程都有自己的堆栈.

2> George..:

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进程堆.



3> Brian Rasmus..:

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

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

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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有