欢迎来到天天文库
浏览记录
ID:37485860
大小:178.07 KB
页数:15页
时间:2019-05-24
《插件式框架探索》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、【插件式框架探索系列】应用程序域(AppDomain)Postedon2010-06-3015:03Kolor阅读(1252)评论(9)编辑收藏所属分类:DotNet,WPF 应用程序域(AppDomain)已经不是一个新名词了,只要熟悉.net的都知道它的存在,不过我们还是先一起来重新认识下应用程序域吧,究竟它是何方神圣。应用程序域 众所周知,进程是代码执行和资源分配的最小单元,每个进程都拥有独立的内存单元,而进程之间又是相互隔离的,自然而然,进程成为了代码执行的安全边界。 一个进程对应一个应用程序是一个普遍的认知,而.net却打破了这一惯例,因为它
2、带来了应用程序域这一全新的概念,CLR可使用应用程序域来提供应用程序之间的隔离,而一个进程中可以运行多个应用程序域,也就是说只要使用应用程序域,我们可以在一个进程中运行多个应用程序,而不会造成进程间调用或进程间切换等方面的额外开销。 是不是觉得应用程序域是个很神奇的东东了,别急,我们再来看看它的隔离特性又为我们带来了什么。优势 首先,应用程序域之间是不相互影响的,它是天生的异常隔离机制。也就是说,在一个应用程序域中出现的错误不会影响到其他应用程序域,因为类型安全的代码不会导致内存错误。 其次,它能够在运行时动态的加载和卸载程序集。我们都知道,在.ne
3、t世界中,加载器一旦加载了程序集,那么它将一直存在于应用程序的整个生命周期中,而应用程序域则改变了这一切,它为我们提供了卸载程序集的能力。 最后,应用程序域可以单独实施安全策略和配置策略。说白了就是可以为每个应用程序域配置相应的权限,以更好的管理应用程序。 另外值得注意的是,应用程序域和线程之间不具有一对一的相关性。在任意给定时间,在单个应用程序域中可以执行多个线程,而特定线程并不局限在单个应用程序域内。也就是说,线程可以自由跨越应用程序域边界,如果没有主动新启线程,那么多个应用程序域依然运行在同一个线程中。 总的来说,应用程序域形成了托管代码的隔离、
4、卸载和安全边界。而这些特性带给一个插件式框架的将是异常隔离、动态加载卸载插件和更安全的插件运行环境。由于这篇文章的定位是针对框架设计结合应用程序域的特性,因此假设你已经对应用程序域有了一定的了解了,下面通过示例,让我们一步一步来认识应用程序域的这些特性。创建和卸载AppDomain 使用C#我们可以用如下的方式创建一个应用程序域,并在新域中执行一段代码: AppDomaindomain=AppDomain.CreateDomain("HelloAppDomain!");domain.DoCallBack(newCrossAppDomai
5、nDelegate(()=>{Windowwin=newWindow{Width=300,Height=100,Content=AppDomain.CurrentDomain.FriendlyName};win.Show();})); 运行后可以看到在新域中创建的Window展示如下: 卸载应用程序域则可以通过AppDomain静态方法AppDomain.Unload(domain)实现,就是这么简单。配置域加载方式如果你运行了上面这段代码,是不是发现新域创建的Window过了好久才呈现出来,这是怎么回事呢,简单来说,这是因为.net加载器默认的行为是在每个域里
6、都会重新加载引用的程序集(包括Framework本身除了mscorlib外的程序集),当然我们可以更改这种行为,不过在这之前我们先来了解下一个新概念”domainneutrality”,详细资料可以看这篇文章DomainNeutralAssemblies,简单来说它拥有跨域共享程序集的能力,这就避免了重复加载的损耗,我们可以通过为程序入口main函数添加LoaderOptimization标签修改默认加载方式: [System.STAThreadAttribute()][System.Diagnostics.DebuggerNonUserCodeAttribute
7、()][LoaderOptimization(LoaderOptimization.MultiDomainHost)]publicstaticvoidMain(){AppDomainTest.Appapp=newAppDomainTest.App();app.InitializeComponent();app.Run();} 重新编译运行,速度有了明显的提升吧。LoaderOptimization有三种方式(SingleDomain,MultiDomain和MultiDomainHost),在DomainNeutralAssemblies中均有详细的解译,有兴趣
8、的朋友可以
此文档下载收益归作者所有