CLR寄宿和应用程序域
- Win实际上将CLR作为一个COM服务器实现在一个DLL内,即为CLR定义了标准的COM接口,并为该接口和COM服务器分配一GUID,安装FrameWork时表示CLR的COM服务器被注册到注册表内.任何Win APP都可以寄宿CLR.
- 一个PC可安装多个版本的CLR,但是只有一个版本(最新版本)的MSCorEE.dll(判断创建何版本的CLR,而CLR COM服务器在MSCorwks.dll和MSCorSvr.dll内)(64位上有两个:For 32B/For 64B).且其知道如何找到以前版本的CLR.宿主可以指定加载的CLR,但是MSCorEE可能加载不同的CLR.
- CLR在MSCoWks.dll中实现,其一个CLR版本一个(在V1.0/V1.1/V2.0下都有).调用CorBindToRuntimeEx()可以在非托管上使用托管代码.
- APP域.
- 提供隔离性(各域拥有独立的内存地址).
- 1)当CLR COM Server初始化时,会创建一个默认APP域,该域仅在进程终止时才被销毁.
- 2)一个APP域中创建的对象不可被另一APP域直接访问.一个APP域可以被卸载,单独实施安全/配置策略.
- 3)Win将每个APP都置于一个地址空间内,进程开销大,APP全托管,可以运行多个托管APP于一个WIN进程内.APP域可卸载单个AM.
- 加载器堆:维护APP被访问过的类型记录,每个类型一个方法表,当方法被执行过后,则指向编译后的本地代码.
- 线程和APP域无1:1关系.APP域为CLR特征,可能多个APP域运行于一个WIN进程内,所以线程可先运行A APP域的代码后再运行B APP域的代码.所以使用APPDomain.CurrentDomian来获取当前APP域(而非Thread.GetDomain).
- AppDomian.CreateDomian在同一WIN进程中创建APP域,并赋予安全/配置策略.
- 在新APP域内创建对象实例:CreateInstanceAndUnWrap(Str1,Str2),Str1为要加载的AM名,Str2为实例的类型名.导致线程迁移至当前APP域并得到对象的引用. Str2的类型:1)派生自MarshakbyRefObject,按引用封装对象.在目的APP域的加载器堆内定义一代理类型(其使用原始类型的元数据定义),其有实例字段表示那个APP域有原始类型该如何查找.运行于新建APP域内2)派生至Object且[Serializable],过程:CLR将对象的实例字段序列化为一字节数组后,Copy至目的APP域(会强制加载;类型的AM到目的APP中),之后反序列化(可能导致CLR加载类型所在AM)之,新建一Type对象,用反序列化的数据初始化之.
- APP域卸载.
- 1)挂起所有执行过托管代码的线程.
- 2)CLR强制任何即将被卸载的APP域上的线程抛出一个ThreadAbortEx,如果未处理,CLR忽略之,线程死亡,进程继续执行.
- 3)遍历加载器堆,将ProxyObject设置为无效.调用其上方法
- 4)GC.
- 5)CLR恢复生育线程的运行.如果调用UnLoad的线程位于即将卸载的APP内,CLR创建一个新线程来试图卸载APP域,如果10秒超时后,后果不可知.
- 提供隔离性(各域拥有独立的内存地址).
- 宿主.
- 1)IE:安装FrameWork时,会同时安装一个MIME筛选器(MSCorIE.dll)挂接到IE上,其处理”Application/octect-streame(x-msdownload)”的MIME类型的下载内容.当检查到有一托管AM被下载时,会调用CorBindToRuntime来加载CLR.由CLR控制,使得不同的WEB站点有各自的APP域,不同的权限集,互补影响.
- 2)ASP.NET:作为一个ISAPI在ASPNet_ISAPI.dll内实现.在Client第一次请求时加载CLR.对同一Web App的请求仅会在第一次时创建一APP域,之后使用同一个进行处理.另一个Web APP被请求时,CLR创建新的APP域.Asp.Net可以在不关闭Web Server时,修改代码,会自动卸载旧的正在运行的版本,后加载新版本.
- 3)Sql Server(本身是非托管的C++代码写的):第一次请求一个托管代码写的存储过程时加载CLR.之后在各自验证过的APP域内运行.
- 宿主控制.
- 1)构建一个APPDomainManager派生类于一AM下,将该AM装到GAC下以拥有Full_Trust权限.由于一个进程只能有一个该类型派生类,将CLR与其关联:非宿主API/环境变量/注册表Key.
- 2)健壮:体面中断:资源清理被执行,不中断Catch/Finally块中的线程;粗鲁中断:资源不被清理,中断Catch/Finally块中的线程.但位于非托管区或临界执行区(进入同步锁并等待的线程,其访问的数据位同一APP域内多线程共享的)的线程无法中断.先体面后粗鲁中断APP域.
- 程序集的加载
- CLR不支持卸载单AM,而必须卸载含有该AM的APP域.
- 性能.
- 1)编译时类型不安全(使用字符串),运行时可能找不到;
- 2)运行速度慢(通过字符串扫描AM的元数据,不区分大小写);
- 3)使用反射调用成员更慢(要将参数打包为[]后,解包到堆栈之前还要检查参数的;类型正确与否).
- 所以,如果需动态发现和构建一类型:让该类型实现一编译时已知类型的接口,运行时构建该类型实例,并将其引用放于一个该接口变量中,之后即可调用方法.
CLR寄宿和应用程序域的更多相关文章
- Clr Via C#读书笔记---CLR寄宿和应用程序域
#1 CLR寄宿: 开发CLR时,Microsoft实际是将他实现成包含在一个dll中的COM服务器.Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID.安装 ...
- 第二十二章 CLR寄宿和AppDomain
1. 概念解析 CLR Hosting(CLR 宿主):初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只不过由于PE ...
- 第22章 CLR寄宿和AppDomain
22.1 CLR寄宿 CLR Hosting(CLR 宿主)的概念:初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只 ...
- CLR寄宿和AppDomain
一.CLR寄宿 .net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用windows ...
- 重温CLR(十六) CLR寄宿和AppDomain
寄宿(hosting)使任何应用程序都能利用clr的功能.特别要指出的是,它使现有应用程序至少能部分使用托管代码编写.另外,寄宿还为应用程序提供了通过编程来进行自定义和扩展的能力. 允许可扩展性意味着 ...
- clr via c# clr寄宿和AppDomain (一)
1 clr寄宿-----.net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用wind ...
- 【C#进阶系列】22 CLR寄宿和AppDomain
关于寄宿和AppDomain 微软开发CLR时,将它实现成包含在一个DLL中的COM服务器. 任何Windows应用程序都能寄宿(容纳)CLR.(简单来讲,就是CLR在一个DLL中,通过引用这个DLL ...
- 第一节:CLR寄宿
本系列文章来自 CLR VIA C# .NET FrameWork在Microsoft Windows平台的顶部运行.这意味着.NET必须用Windows可以理解的技术来构建.首先,所有的托管模块和 ...
- WinDbg探究CLR底层(1) - 应用程序域
一.什么是应用程序域 操作系统由于其稳定性与可靠性的要求,都会使用隔离层,来确保运行在某个隔离层内的代码不会对其他隔扇层的代码产生影响.如Windows通过进程来实现这种隔离机制,所能的可执行代码.数 ...
随机推荐
- DIV+CSS左右两列自适应高度的方法
我们在用DIV+CSS布局网页的时候,必然会遇到左右两列自适应高度的问题,就是左边列的背景会随着右边列内容的增加也相应的增加高度,下面就教大家DIV+CSS左右两列自适应高度的方法. 下面给出最终的效 ...
- MySQL主主高可用(keepalive)
2台新的虚拟机172.16.1.1.172.16.1.2 (配置yum源 ) 安装数据库服务 其中 172.16.1.1.172.16.1.2运行数据库服务并设置数据库管理员从本机登录的密码是xzw ...
- Java常用类(I)-时间和日期
java开发中,常涉及到时间的处理,这里就做一个总结,同样也是一个笔记. 相关类及概念 1. java.util.Date:表示特定的瞬间,精确到毫秒.由于API 不易于实现国际化,日期和时间字段之间 ...
- 【udacity】机器学习-波士顿房价预测小结
Evernote Export 机器学习的运行步骤 1.导入数据 没什么注意的,成功导入数据集就可以了,打印看下数据的标准格式就行 用个info和describe 2.分析数据 这里要详细分析数据的内 ...
- jemeter参数化读取文件
1.新建一个123.csv文件 如图 2.添加http请求 3.添加一个查看结果树 二.通过函数助手 (1)打开函数助手 ......... 在json属组中引入变量 这是别人参考的
- mysql笔记1------基础
1.简介 (这两个结构就是ER模型)
- Django_学生管理系统
一. Django简易学生管理系统 1.在pycharm中创建工程student_manage_system,添加app:student_manage 2.配置静态文件:在工程项目目录下新建目录sta ...
- [BZOJ1999] 树网的核 [数据加强版] (树的直径)
传送门 如果只是想验证算法正确性这里是洛谷数据未加强版 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenet ...
- 《你又怎么了我错了行了吧》【Alpha】Scrum meeting 4
第四天 日期:2019/6/17 前言: 第4次会议在女生宿舍召开 对前面的系统改进有了方向,讨论了代码编写的分配问题 1.1 今日完成任务情况以及明天任务安排 姓名 当前阶段任务 下一阶段任务 刘 ...
- css下背景渐变与底部固定的蓝天白云
<?php defined('_JEXEC') or die; JHtml::_('behavior.framework', true); //if(!$templateparams->g ...