AppDomain

AppDomain的功能:

  • 一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。只能使用“按引用封送”(marshal-by-reference)或者“按值封送”(marshal-by-value)的语意
  • AppDomain可以卸载。CLR不支持从AppDomain中卸载一个程序集,但可以卸载一个AppDomain,从而卸载当前包含在该AppDomain中的所有程序集
  • AppDomain可以单独保护
  • AppDomain可以单独配置

 

按引用封送:

源AppDomain想想目标AppDomain发送或者返回一个对象引用时,CLR会在目标AppDomain中的Loader堆中定义一个代理类型。这个代理类型是用原是类型的元数据定义的。因此看起来和原始类型完全一样。但是实例自定不会成为代理类型的一部分。如果源AppDomian被卸载后,仍然通过代理调用源类型中定义的方法,将会抛出AppDomainUnloadedException异常

 

按值封送:

源AppDomain想向目标AppDomain发送或者返回一直对象引用时,CLR将对象的实例字段序列化成一个字节数组。这个字节数组从源AppDomain复制到目标AppDomain。然后,CLR在目标AppDomain中反序列化字节数组,这会强制CLR将定义了被反序列化的类型的程序集加载到目标AppDomain中(如果尚未加载的话)。接着CLR创建类型的一个实例,并利用字节数组中的值初始化对象的字段。至此,源AppDomain中的对象和目标AppDomain中的对象就有了独立的生存期,它们的状态也是可以独立地更改

posted @ 2012-09-05 23:42  HelloWorld.Michael  阅读(274)  评论(0编辑  收藏  举报