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

推荐订阅源

爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
Webroot Blog
Webroot Blog
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
H
Heimdal Security Blog
H
Help Net Security
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
F
Full Disclosure
小众软件
小众软件
S
Securelist
罗磊的独立博客
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
S
Schneier on Security
D
DataBreaches.Net
M
MIT News - Artificial intelligence
V
Vulnerabilities – Threatpost
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
F
Fortinet All Blogs
T
Tenable Blog
The Register - Security
The Register - Security
C
Check Point Blog
AWS News Blog
AWS News Blog
Cloudbric
Cloudbric
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google Online Security Blog
Google Online Security Blog
博客园 - 叶小钗
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 司徒正美

博客园 - 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