惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
MyScale Blog
MyScale Blog
Jina AI
Jina AI
B
Blog
Microsoft Security Blog
Microsoft Security Blog
T
Troy Hunt's Blog
博客园_首页
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
GbyAI
GbyAI
T
Tenable Blog
B
Blog RSS Feed
S
Securelist
T
Threat Research - Cisco Blogs
P
Privacy International News Feed
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
罗磊的独立博客
AWS News Blog
AWS News Blog
V
V2EX
宝玉的分享
宝玉的分享
J
Java Code Geeks
小众软件
小众软件
Spread Privacy
Spread Privacy
腾讯CDC
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
V
Visual Studio Blog
The Hacker News
The Hacker News
C
CERT Recently Published Vulnerability Notes
Project Zero
Project Zero
Know Your Adversary
Know Your Adversary
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
Apple Machine Learning Research
Apple Machine Learning Research
NISL@THU
NISL@THU
C
Check Point Blog
Webroot Blog
Webroot Blog
D
DataBreaches.Net
Cloudbric
Cloudbric
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家

博客园 - iceboundrock

Introduction to the Reactive Extensions for JavaScript文章集合(收集贴) 美化VS2010在远程桌面/无法启动硬件加速渲染的机器下的字体显示 CCR源码分析-CCR架构 CCR源码分析-分析环境准备 CCR相关的Channel 9视频 DSS简介 Common UNIX directories 几篇优化.net动态调用性能的文章 安装TFS 2008备注 Windbg点滴 MySQL Connector/Net 5.20安装后无法在VS2008中正常使用的问题 LAMP周边点滴 并行与并发编程学习心得 并发和协调运行时 其它并发方法 与非CCR代码互操作 失败处理 迭代器 任务调度
也许你还不知道的一些关于App Domain的事
iceboundrock · 2009-09-22 · via 博客园 - iceboundrock

今天翻阅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