1
CLR寄宿

.NET Framework在Windows平台的顶部运行,意味着.NET Framework必须用Windows可以理解的技术构建:所有托管模块和程序集文件都必须使用Windows PE文件格式,要么是一个Windows EXE文件,要么是一个DLL文件。

CLRCreateInstance函数

定义在程序集MSCorEE.dll中,该程序集一般被成为垫片,该文件一般在C:\Windows\System32目录中。它的工作是负责决定创建哪个版本的CLR。

一台机器可以安装多个版本的CLR,但是只有一个版本的MSCorEE.dll文件。机器上安装的MSCorEE.dll版本是与安装的最新版的CLR一起发布的那个版本。

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

GetRuntime函数返回一个指向非托管接口ICLRRuntimeInfo的指针,通过调用GetInterface方法获得ICLRRuntimeHost接口,可利用该接口做以下事情:

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

*Windows进程完全可以不加载CLR,只有需要在进程中执行托管代码时才需要加载它

CLR寄宿的好处
  • 可以用任何编程语言来编写
  • 代码在JIT编译后执行而不是一边解释一边执行,所以速度很快
  • 代码使用垃圾回收避免内存泄漏和损坏
  • 代码在一个安全的沙箱中运行
  • 宿主不必操心提供一个丰富的开发环境。宿主可以利用现有的技术,包括语言、编译器、编辑器、调试器、profiler等

DoubleJ
7 声望3 粉丝

« 上一篇
垃圾回收(GC)
下一篇 »
程序集加载