NCindy

.net平台上的高性能网络程序开发框架

也许你还不知道的一些关于App Domain的事

今天翻阅msdn时看到一个概念Domain Neutral Assemblies,虽然这个咚咚的名字字面意思挺清楚,但是之前从未接触过,于是特意搜索了一番,东拉西扯之下,也学到了一些关于App Domain的有趣的东西,在这里总结记录一下。
首先,App Domain是什么?MSDN里给出了一堆文字来说明。其实简单的说,App Domain就是是一个轻量级的进程。
  • Domain Neutral Assemblies
顾名思义,Domain Neutral Assemblies就是不跟特定App Domain相关而可以跨越多个App Domains的Assembly。大家都知道,一般情况下,我们自己创建App Domain都是为了动态的加载/卸载一些Assemblies,但是Domain Neutral Assemblies比较特殊,它是不能随着App Domain被unload的。而且处于性能的考虑,Domain Neutral Assemblies只会被JIT一次,JIT之后的代码会存储在Share Domain中。但是Assemblies相关的数据依然会存储在每个加载它的App Domains中。例如:某个Application中有几个App Domains,而Assembly A被作为一个Domain Neutral Assembly加载。A中有一个类型T,T有一个静态变量S,那么T.S在每个App Domain中的值是分别存储的,修改一个App Domain中的T.S不会改变另一个App Domain中的T.S。
  • Friend Assemblies
就像C++中的friend classes,在.net 2.0中引入了friend assemblies。通过给Assembly A设置InternalsVisibleToAttribute属性来设置B是A的Friend Assembly。这样B中的类型就可以访问A中的internal类型和internal成员(方法/属性/子段/事件等)。
  • 如何加载Assemblies到一个App Domain
.net提供了多种方法加载一个Assembly到App Domain,但是推荐使用Assembly.Load方法来做这件事。剩下的方法还有:Assembly.LoadFrom, Assembly.ReflectionOnlyLoad, Assembly.ReflectionOnlyLoadFrom。还有一些看起来跟加载Assembly无关的方法,其实也有加载Assembly的副作用,比如Type.GetType, AppDomain.CreateInstance, AppDomain.CreateInstanceAndUnwrap。
比较特别的一个方法是AppDomain.Load,这个方法是不推荐在Managed Code中调用的。因为如果你在App Domain A中调用了App Domain B的Load方法,B.Load其实是将Assembly加载到了App Domain B中,这还不是最糟糕的,最糟糕的是,AppDomain的Load方法会返回Assembly的引用到A,还记得吧,App Domain之间是隔离的,A并不能直接调用B中的方法和类型而是要通过Marshal的方式来通讯,但是由于Assembly不是从MarshalByRef继承,所以Assembly对象必须以Marshal by value的方式返回到A中,这时A会再次根据自己的配置来定位和加载这个Assembly,最好的情况下就是B和A都加载了这个Assembly,如果运气不好,A和B设置的搜索路径不同而A恰好找不到这个Assembly,boom,一个FileNotFoundException就被抛出啦。
  • Reflection-Only Context
通过Assembly的ReflectionOnlyLoad/ReflectionOnlyLoadFrom方法可以把一个Assembly加载到Reflection-Only context中,顾名思义,在这个上下文中的Assembly只能用于反射而不能用于执行。通过这个方法可以加载不同CLR版本的Assembly,我想著名的Reflector应该就是用的这种办法吧。唯一一个例外就是mscorlib,即使用ReflectionOnlyLoad也是无法加载不同CLR版本的mscorlib。





参考资料:
http://blogs.msdn.com/junfeng/archive/2004/08/05/208375.aspx
http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx
http://msdn.microsoft.com/en-us/library/43wc4hhs.aspx


posted on 2009-09-22 16:27  iceboundrock  阅读(1198)  评论(0编辑  收藏  举报

导航