插件式框架探索

插件式框架探索

ID:37485860

大小:178.07 KB

页数:15页

时间:2019-05-24

插件式框架探索_第1页
插件式框架探索_第2页
插件式框架探索_第3页
插件式框架探索_第4页
插件式框架探索_第5页
资源描述:

《插件式框架探索》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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、的朋友可以

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。