CLR寄宿和AppDomain

一、CLR寄宿

.net framework在windows平台的顶部允许。者意味着.net framework必须用windows能理解的技术来构建。所有托管模块和程序集文件必须使用windows PE文件格式,而且要么是windows exe文件,要么是DLL文件

1,MSCorEE.dll(垫片)
①CLRCreateInstance函数在MSCorEE.dll文件中实现。“垫片”的工作是决定创建哪个版本的CLR(1.0、2.0、3.0的CLR代码在MSCorWks.dll文件中;版本4则在Clr.dll文件中)

②CLRCreateInstance函数可返回一个ICLRMetaHost接口。宿主应用程序可调用这个接口的GetRuntime函数,指定宿主要创建的CLR版本。然后,垫片将所需版本的CLR加载到宿主的进程中

2,ICLRRuntimeHost可以做以下事情
①设置宿主管理器。该诉CLR宿主想参与与涉及以下操作的决策:内存分配、线程调度/同步以及程序集加载等。宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知
②获取CLR管理器。告诉CLR阻止使用某些类/成员。另外,宿主能分辨哪些代码可以调试,哪些不可以,以及当特定事件(例如AppDomain卸载、CLR停止或者堆栈移除异常)发生时宿主应调用哪个方法
③初始化并启动CLR
④加载程序集并执行其中的代码
⑤停止CLR,阻止任何更多的托管代码在Windows进程中运行

二、AppDomain

CLR COM服务器初始化时会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。CLR初始化时创建的第一个AppDomain称为“默认AppDomain”,这个默认的AppDomain只有在Windows进程终止时才会被销毁

1,AppDomain的具体功能
①一个AppDomain的代码不能直接访问另一个AppDomain的代码创建的对象。
一个AppDomain中的代码创建了一个对象后,该对象便被该AppDomain“拥有”。换言之,它的生存期不能超过创建它的代码所有的AppDomain。一个AppDomain中的代码要访问另一个AppDomain的对象,只能使用“按引用封送”或者“按值封送”的予以。这就强制建立了清晰的分割和边界,因为一个AppDomain中的代码不能直接引用另一个AppDomain中的代码创建的对象。这种隔离使AppDomain能很容易地从进程中卸载,不会影响其他AppDomain正在运行的代码
②AppDomain可以卸载
CLR不支持从AppDomain中卸载特定的程序集,但可以告诉CLR卸载一个AppDomain,从而卸载该AppDomain当前包含的所有程序集
③AppDomain可以单独保护
AppDomain创建后会应用一个权限集,它决定了想这个AppDomain中运行的程序集授予最大权限,正是由于存在这样的权限,所以当宿主加载一些代码后,可以保证这些代码不会破坏(或读取)宿主本身使用的一些重要数据结构
④AppDomain可以单独配置
AppDomain创建后会关联一组配置设置。这些设置主要影响CLR在AppDomain中加载程序集的方式,设计搜索路径、版本绑定重定向、卷影复制以及加载器优化

2,Windows进程

中立的AppDomain:

MSCorLib.dll包含了System.Object,System.Int32以及其他所有与.NET Framework密不可分的类型

该Loader堆中的所有类型对象,以及为这些类型定义的JIT编译生成的所有本机代码,都会由进程中的所有AppDomain共享

该中立的AppDomain不能被卸载,除非终止windows进程

时间: 2024-11-25 11:51:02

CLR寄宿和AppDomain的相关文章

CLR via C#读书笔记 CLR寄宿和AppDomain

寄宿 寄宿是指让其他应用程序(非托管代码)使用CLR的能力,比如自己用C++开发的窗体能创建CLR实例. 托管代码也能调用非托管代码 [DllImport("kernel32.dll")] public static extern int WinExec(string exeName, int operType); 通常会调用win32 api,但是要查文档才知道怎么定义extern方法 CLR实际上被实现为COM服务器,可以通过CoCreateInstance或CLRCreateIn

【C#进阶系列】22 CLR寄宿和AppDomain

关于寄宿和AppDomain 微软开发CLR时,将它实现成包含在一个DLL中的COM服务器. 任何Windows应用程序都能寄宿(容纳)CLR.(简单来讲,就是CLR在一个DLL中,通过引用这个DLL,可以实现包含CLR) CLR COM服务器初始化会创建一个默认AppDomain,这个AppDomain只有在进程终结时才会被销毁. 然而宿主程序还可以要求CLR创建额外的AppDomain. 因为创建进程开销很大,并且需要大量内存来虚拟化进程的地址空间. 所以人们就像可不可以在一个进程上运行多个

第22章 CLR寄宿和AppDomain

寄宿允许使任务应用程序都能利用CLR的功能.寄宿(hosting)允许使任务应用程序都能利用CLR的功能.另外,寄宿还为应用程序提供了通过编程来进行自定义和扩展能力.AppDomain允许第三方的,不受信任的代码在一个现有的进程中运行,而CLR保证数据结构.代码和安全上下文不会被滥用或破坏. 22.1 CLR寄宿 CLR Hosting(CLR 宿主)的概念:初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只不过由

clr via c# clr寄宿和AppDomain (一)

1 clr寄宿-----.net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用windows PE文件格式,而且要么是windows exe文件,要么是DLL文件 2,ICLRRuntimeHost可以做以下事情①设置宿主管理器.该诉CLR宿主想参与与涉及以下操作的决策:内存分配.线程调度/同步以及程序集加载等.宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知②获取C

《CLR via C#》 第22章 CLR寄宿和AppDomain 跨越AppDomain边界访问对象

跨越AppDomain边界访问对象 将书中的代码(3处)将“MarshalByRefType”修改为“typeof(MarshalByRefType).FullName”,即可得到书中的输出结果: 将:MarshalByRefType mbrt = (MarshalByRefType)ad2.CreateInstanceAndUnwrap(exeAssembly,“MarshalByRefType”); 修改为:MarshalByRefType mbrt = (MarshalByRefType)

Clr Via C#读书笔记---CLR寄宿和应用程序域

#1 CLR寄宿: 开发CLR时,Microsoft实际是将他实现成包含在一个dll中的COM服务器.Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID.安装.NET Framework时,代表CLR的COM服务器在Windows注册表中注册. 任何Windows应用程序都可以寄宿CLR,非托管宿主应该调用MetaHost.h文件中声明的CLRCreateInstance函数,该函数是在MSCoreEE.dll文件中实现的,该dll被称为"垫片"

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 VIA C# .NET FrameWork在Microsoft  Windows平台的顶部运行.这意味着.NET必须用Windows可以理解的技术来构建.首先,所有的托管模块和程序集文件都必须使用Windows PE文件格式,而且要么是一个Windows.exe文件,要么是一个DLL文件. 开发CLR时,Microsoft实际是将它实现成包含在一个DLL中的COM服务器.也就是说,Microsoft为CLR定义了一个标志的COM接口,并为该接口和COM服务器分配了GUID

CLR via C#学习笔记----知识总概括

第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问CLR的所有功能. JITCompiler函数负责将一个方法的IL代码编译成本地CPU指令.由于IL是“即时”(just in time)编译的,所以通常将CLR的这个组件称为JITter或者JIT编译器. Microsoft定义了一个“公共语言规范”(Common Language Specific