【框架设计】CLR寄宿和应用程序域
CLR寄宿和应用程序域
概述:认识什么是CLR寄宿和应用程序域?CLR寄宿:允许任何应用程序域使用CLR的特征。允许已有的应用程序至少局部使用托管代码编程,并为应用程序提供通过编程支持自定义和可扩展性的能力。应用程序域:允许第三方信任的代码在已存在的进程中运行,并保证应用程序的数据结构,代码以及安全上下文不被利用或不遭受安全风险。
C#基础系列导航
- C#实现队列读写操作(一)
- 变化多端的列表(二)
- VS自动内存管理(垃圾回收集)(三)
- C#忽略基础知识点梳理(四)
- 什么是框架的接口(五)
- 程序集的加载与反射(六)
- CLR寄宿和应用程序域(七)
- 异常(八)
认识什么是CLR寄宿和应用程序域?
CLR寄宿:允许任何应用程序域使用CLR的特征。允许已有的应用程序至少局部使用托管代码编程,并为应用程序提供通过编程支持自定义和可扩展性的能力。
应用程序域:允许第三方信任的代码在已存在的进程中运行,并保证应用程序的数据结构,代码以及安全上下文不被利用或不遭受安全风险。
CLR寄宿:
任何windows应用程序都可以寄宿,寄宿程序可以调用接口中定义的方法来设置下述各项:
1设置宿主管理器,告诉clr宿主希望参与内存分配,线程调度和同步,程序集加载等决定。
2获取CLR管理器,告诉clr阻止使用某些类或成员。以及发生某个事件宿主应调用哪个方法。
3初始化并启动CLR。
4加载程序集并执行程序集中的代码。
5停止CLR,从而阻止任何托管代码在windows中运行。
任何寄宿CLR的应用程序帮助开发人员提供的便利问题:
1,可以选择任意喜欢的编程语言
2,代码被JIT编译,加快速度。
3,代码使用垃圾收集器,避免内存泄漏和破坏。
4,代码在安全的杀向中进行。
5,宿主不必担心提供一个丰富的开发环境,宿主可以使用现有的技术,例如:编程语言,编译器,编辑器,调试器,评测器等
应用程序域:
当CLR COM服务器开始初始化时,就会创建一个应用程序域。一个应用程序域是一组程序集的逻辑容器。CLR初始化时创建的第一个应用程序称为默认程序域。该程序域只有进程终止时才会被销毁。应用程序域的全部目的在于提供隔离性。
应用程序域的特征如下:
1一个应用程序域中的代码创建的对象不能被另一个应用程序域的代码访问。(如果访问只能通过按引用封存处理或按值封存处理访问)这种隔离的好处在于运行或卸载一个进程不会影响其他进程正常工作。
2应用程序域可以被卸载。一旦卸载,整个程序集都被卸载。
3应用程序域可以单独实施安全策略。
4应用程序域可以单独实施配置策略。
关于一个寄宿了CLR和两个应用程序域的windows进程问题:
单独的windows进程中,该进程运行一个CLR COM服务器,该CLR当前管理另个应用程序域,每个应用程序域都有自己的加载器堆,加载器堆维护自应用程序创建以来被访问的类型记录。每个类型对象都是一个方法表,对方法中每条条目,如果其中的方法至少被执行过一次,那么它将执行JIT编译后的本地代码。
AppDomain的几个方法:
CreateDomain(“程序域名称”,null,null)
MarshalByRefType(引用封装处理)
MarshalByValueType(值封装处理)
NotMarshalablefType(不用封装处理)
CreatrInstanceAndUnwrap(指定程序集,"MarshalByRefType(指定类型)")
应用程序域的卸载:
卸载一个应用程序集可以导致CLR卸载应用程序域中的所有程序集,并且释放应用程序域的加载器堆。可以通过调用AppDomain静态方法Unload方法实现。
通过以下步骤卸载指定应用程序域:
1CLR挂起进程中所有执行过托管代码的线程。
2CLR检查所有线程堆可能返回到即将被卸载的应用程序域中的代码。
3第二步发现所有线程离开应用程序域后,CLR接着遍历加载器堆,并为每个引用已卸载应用程序域所创建对象的代理对象设置标记。
4CLR强制执行垃圾收集,回收被已卸载应用程序域创建的任何对象占用的内存,通过Finalize方法回收
5CLR恢复余下所有线程的执行。
宿主如何使用应用程序域:
调用一个托管堆的可执行文件时,垫片检查包含在应用程序集中的CLR头信息,头信息指出构建和测试应用程序时所使用的CLR的版本,垫片使用该信息来确定进程中加载哪个版本的CLR。当CLR加载并完成初始化后,垫片会再次检查程序集CLR头信息。从而决定哪个方法是程序入口点,CLR调用这个方法,应用程序就启动开始运行。
作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。
出处:http://www.cnblogs.com/baiboy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。