【个人笔记】CLR Via C# 第一章 CLR执行模型

第一章 CLR执行模型

热点重点

  1. 公共语言运行库(CLRCommon Language Runtime):
    1. 一个运行库
  2. 编译器:
    1. 面向CLR的编译器,能编译出托管模块。C++编译器可编译出非托管模块代码
  1. 托管模块(managed module):
    1. 是编译器编译的结果
    2. 结构:中间语言和元数据
    3. 具体结构:PE32PE32+头,CLR头,元数据,IL代码
  1. 中间语言(ILIntermediate Language):
    1. 在运行时,CLR将其编译成本地CPU指令
    2. 可理解为面向对象的机器语言
  2. 元数据(metadata):
    1. 一系列特殊的数据表,描述模块定义的内容
  3. 程序集(assembly):
    1. 一个或多个模块/资源文件的逻辑性分组。在CLR中也称为组件(component
  1. JITjust-in-time)编译器:
    1. IL转换成本地CPU指令
  1. 不安全代码:
    1. C#编译器对不安全代码打上unsafe关键字来标记
    2.  System.Security.Permissions.SecurityPermissionsFlag  = ~.SkpiVerification 时,允许执行不安全代码
    3. 可利用PEVerify.exe查看程序集中是否含有不安全代码
  2. WoW64windows on windows64)技术:
    1. 允许运行32Windows应用程序
    2. Win64Itanium用该技术运行32位程序
  3. Itanium机器:
    1. CPUIA64版本,与x64x86版本不同
    2. 拥有WoW64技术,可运行32位程序
  4. 编译器优化代码
    1. 托管程序比非托管程序的性能要


执行模型

  1. 加载程序集到内存
  2. 执行某个方法时候先查看是否已编译为本地代码。

第一次调用:调用JIT编译IL为本地代码保存在内存中。

      对程序性能造成极小的影响,并会分配动态内存。

以后的调用:直接找到内存中已经编译过的代码,而直接跳过JIT编译。

  1. 由于托管代码生成的CPU指令具有特别强的针对性,而且微软把JIT编译的消耗降到了最低最低,

所以托管代码比非托管代码性能更高

 

代码形式

运行形式

性能(相对)

 

非托管代码

静态的CPU指令

直接读取

 

托管代码

中间语言IL

CLR读取,并由JIT生成

针对性CPU指令

 


JIT编译IL为本地代码

本地代码生成器:NGen.exe。由.NET Framework配套提供。

功能:可以将IL代码编译为本地代码。

作用:

  1.  提高程序启动速度(JIT无需再编译IL代码)
  2. 减少应用程序的工作集,可以将程序集编译为IL代码,于是运行时候JIT无需再编译

缺点:

  1.  可能失去同步。如果发布了新版本的程序集,那么JIT也不会编译IL代码而是直接用NGen.exe所生成的本地代码。
  2. 没有知识产权保护。生成的本地代码脱离了原IL代码,但是运行时,CLR要求访问程序集的元数据,所以要同时发布包含IL和元数据的程序集。
  3. 执行性能差。因为不是JIT编译,所以如果移植后,不能对CPU进行针对性代码生成。
  4. 加载性能差。牵涉到内存分配,如果JIT编译的话可以动态分配,NGen.exe生成的程序集以静态方式计算内存地址引用,若windows不能再其首选基址加载程序集,则会重新定位文件




?查看电脑的.NET Framework版本

先查看是否安装了.NETFramework ,资源浏览器输入:%SystemRoot%\System32,查看存在文件 mscoree.dll,则已安装。

  1. 注册表方式

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy

  1. VS命令行方式

”VS工具命令提示的窗口中输入:CLRVer.exe -all

  1. CMD命令行方式

dir %WINDIR%\Microsoft.Net\Framework\v*

  1. 资源浏览器方式

输入:%systemroot%\Microsoft.NET\Framework


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值