• 【框架设计】CLR寄宿和应用程序域


         CLR寄宿和应用程序域

    概述:认识什么是CLR寄宿和应用程序域?CLR寄宿:允许任何应用程序域使用CLR的特征。允许已有的应用程序至少局部使用托管代码编程,并为应用程序提供通过编程支持自定义和可扩展性的能力。应用程序域:允许第三方信任的代码在已存在的进程中运行,并保证应用程序的数据结构,代码以及安全上下文不被利用或不遭受安全风险。

    C#基础系列导航


    1. C#实现队列读写操作(一)
    2. 变化多端的列表(二)
    3. VS自动内存管理(垃圾回收集)(三)
    4. C#忽略基础知识点梳理(四)
    5. 什么是框架的接口(五)
    6. 程序集的加载与反射(六)
    7. CLR寄宿和应用程序域(七)
    8. 异常(八)

    认识什么是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调用这个方法,应用程序就启动开始运行。

  • 相关阅读:
    ASCII码表记忆规律
    Live Photos原理
    FAAS -- Serverless
    wasm能力检测
    守则
    split分割文件
    个人开源项目:微服务全栈技术学习开源项目,涵盖Java及前端主流技术点
    采用React+Ant Design组件化开发前端界面(一)
    SpringBoot 2.0中SpringWebContext 找不到无法使用的问题解决
    [做全栈攻城狮]程序员带你学习安卓开发-安卓基础之网络编程 大汇总
  • 原文地址:https://www.cnblogs.com/baiboy/p/c7.html
Copyright © 2020-2023  润新知