NET CLR via C#读书笔记 - 第一章 CLR执行模型

《CLR via C#》CLR基础 CLR是公共语言运行库(Common Language Runtime),又叫公共语言运行时。CLR和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境,可由面向CLR的所有语言使用。它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。 .NET框架是一种以CLR为基础、支持多种语言(C#、F#、VB.NET、C++、Python等)的开发的软件... 阅读详情

CLR执行模型

1.1 CLR简介

CLR(Common Language Runtime(公共语言运行时))可以简单理解为是一个支持多种编程语言及多语言互操作,完整的高级虚拟机。

  程序在运行的时候有着惊人数量的运行时依赖。每个有用的程序都需要某些运行时函数库,以便其能跟电脑的其它资源(如用户输入设备,磁盘文件,网络通信等)交互,同时程序也需要转换成计算机硬件可以直接执行的某种格式。这些依赖的数量是多而广的,使得编程语言的设计者通常都引用其它标准来规范它们。例如C++编程语言不会规定C++程序的格式,每个C++编译器都会与特定的硬件架构(如x86架构)关联,与特定的操作系统环境(如Windows,Linux或者Mac OS)关联,这些架构和环境会规定可执行文件的文件格式以及加载的方式。因此,程序员不是在编写一个“C++可执行程序”,而是编写与架构和环境相关的可执行程序,例如“Windows X86可执行程序”或“Power PC Mac OS可执行程序”。
  CLR通过定义一个 [非常完整的规范]ecma-spec来描述一个程序从编译、到部署时绑定依赖、到运行整个生命周期的所有信息。CLR还定义了以下内容:
  ① 一套支持GC,并包含自己的执行程序基本操作的指令集(通用中间语言 - CLI)的虚拟机,这也就意味着CLR不需要依赖指定类型的CPU;
  ② 一套描述程序里声明的元素(如类型、值、变量等等)的元数据,以便编译器在生成其它可执行文件时有足够的信息来从“外部”调用程序里的功能;
  ③ 一个精确描述字节应该如何在文件里布局的文件格式,这样我们在讨论CLR EXE的时候,不与某个特定的操作系统或电脑硬件绑定;
  ④ 进程的生命周期语义,即一个CLR EXE引用其它CLR EXE的机制,和CLR在运行时找到进程依赖文件的规则;
  ⑤ 利用CLR内置功能(如垃圾回收、异常和泛型等)的类库,其除了提供如整形、字符串、数组、列表和字典等基本功能意外,还提供了如文件、网络和UI交互等操作系统服务。
多编程语言支持
  定义、规范和实现这些细节是一个艰巨的任务,这也就是类似CLR的完整抽象非常少的原因。实际上,大部分抽象都是为单个编程语言设计的。例如,Java运行时,Perl解释器或者早期的Visual Basic运行时提供了类似的完整抽象。但CLR跟这些先行者不同之处在于其支持多种编程语言。可能除了Visual Basic(因为它采用了COM对象模型),仅使用单个编程语言的体验是非常好的,但是要与其它编程语言互操作时体验就有点差了。编程语言之间互操作之所以困难,是因为这些编程语言仅能通过操作系统提供的原语来与“外族”编程语言通信。而操作系统的抽象层次太低阶(如操作系统不提供内存垃圾回收),就不得不采用一些复杂的技术。通过提供 通用语言运行时,CLR允许编程语言之间采用高阶结构(如可GC的数据结构)通信,大量减轻了互操作的麻烦。
  由于运行时在 许多 语言之间共享,这就意味着更多的资源可被支持。为一个编程语言实现好的调试器和性能分析工具需要大量的工作,因此只有一些很重要的编程语言才有完整的工具链支持。然而,CLR上实现的编程语言可以共享这些基础架构,实现新的编程语言的工作量也大大缩减了。也许更重要的是,所有在CLR上实现的编程语言都可以访问 所有 在CLR上实现的类库。庞大且不断增长的(严格调试和支持)功能是CLR如此成功的一个重要原因。
  简单来讲,CLR是一个将字节存到文件以创建和运行程序的完整规范。虚拟机可以使用不同编程语言写就的类库来运行这些程序。这个虚拟机,还有运行其上的不断增长的类库,就是我们说的通用语言运行时(CLR)。

以上内容为转载内容,如需了解更多请点击跳转阅读

1.2 CLR执行模型

CLR执行模型可以归纳为以下部分:
① 将源代码编译成托管模块
② 将托管模块合并成程序集
③ 加载CLR
④ 执行程序集代码

1.2.1 将源代码编译成托管模块

  将源代码编译成托管模块,此工作由面向CLR的编译器负责完成,托管模块是标准的32位Microsoft Windows可移植执行体(PE)文件,或者是标准的64位Microsoft Windows可移植执行体(PE32+)文件。
编译出来的托管模块包含以下内容:

组成部分说明
PE32/PE32+头PE32格式,能在WIN 32或64位版本操作系统中运行。
PE32+格式,只能在WIN 64位版本操作系统中运行。
头信息中包含文件类型标识(GUI,CUI或DLL),时间标识(文件生成时间),如果托管模块中包含本机(native)CPU相关代码,则还需要额外包含本机CPU相关信息。
CLR头包含CLR版本信息,一些标志信息(flag),托管模块入口函数(main)的方法定义,模块的元数据,资源,强名称以及其它相关信息
元数据包含元数据表,主要有两种表,一种是记录代码中定义的类型和成员,另一种是代码中引用的类型和成员。
IL代码面向CLR的编译器编译源代码时生成的代码,该代码在运行时,由CLR加载并编译成本机CPU代码。

补充说明:托管模块中元数据和IL代码是强关联的,元数据与IL代码永远保持同步。

1.2.2 将托管模块合并成程序集

程序集是一个或多个模块/资源文件的逻辑性分组,CLR实际不直接和托管模块工作,实际是和程序集工作,程序集是重用,安全性以及版本控制的最小单元,在CLR中,程序集就相当于“组件”。

关于程序集的描述会在后续的读书笔记中详细描述,此处暂不展开讨论。

1.2.3 加载CLR

  前文简单描述了CLR是什么,所以用户计算机必须先安装好CLR,CLR包含在Microsoft .Net Framework框架中,关于Microsoft .Net Framework框架如何安装,此处不进行描述。
  用户计算机执行exe文件时,检查exe文件头,决定创建32位进程还是64位进程,随后在进程地址空间加载MSCorEE.dll的x86,x64或者ARM版本,然后进程的主线程调用MSCorEE.dll中定义的一个方法,这个方法初始化CLR,加载exe程序集,再调用程序集中的入口方法(main),由此exe启动完成并开始运行。

1.2.4 执行程序集代码

  为了在某一具体CPU机器上执行程序,首先要做的就是将托管模块中的IL代码转换为本机(native)CPU指令,这一工作由JIT(just-in-time)编译器完成。
执行流程

第一步:Main()方法执行前,CLR检测Main()方法中引用的所有类型,每一个检测出来的引用类型都会为其分配一个内部数据结构,用于映射源代码中定义或者引用的类型,本流程中Main()方法中引用了Console类型,所以CLR会生成一个Console的内部数据结构类型,内部数据结构中对原类型中所有方法都会有一个对应的记录项,并与之对应生成一个未编档函数(此处记为JITCompiler)。
第二步:Main()首次调用WriteLine时,会调用JITCompiler函数,函数内部执行步骤如上图所示,可分为下面6个小步骤:
① 在元数据中查找调用的方法
② 查找到后再查找与其相关的IL代码
③ 分配内存空间
④ 验证IL代码并编译成本机代码,并将本机代码保存到分配的内存空间中
⑤ 修改内部数据结构中与本JITCompiler对应的记录,使其指向本机代码保存的内存空间
⑥ 跳转到本机代码保存的内存空间,执行完成后返回Main()中。
第三步:第二次调用相同函数时,不需要再进行相关内存分配和验证操作,而是直接跳转到该函数的本机代码内存地址,直接执行相关函数。

  以上内容为对《NET CLR via C#(第四版)》第一章内容的阅读笔记,只记录其中核心部分内容,如需要详细阅读请自行查看本书第一章内容。

《CLR via C#》学习笔记【1】 一、CLR的执行模块1.1 将源代码编译成托管模块 非托管C/C++可对系统进行低级控制,按自己的想法管理内存、VB可以快速生成UI应用程序,并控制COM对象和数据库。 公共语言运行时(Common Language Runtime, CLR)是一个由多种编程语言使用的“运行时”。CLR的核心功能(如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 事实上在运行 阅读详情

相关推荐

CLR via C#: 4th Edition with Full Table of Contents

CLR是.NET平台的运行时引擎,它负责管理代码的执行,提供了诸如内存管理、线程同步、异常处理等运行时服务。CLR使得.NET支持的编程语言可以在相同的虚拟环境中运行,而与底层操作系统和硬件平台无关。这种特性使得.NET应用程序具有良好的可移植性。.NET类型系统是建立在值类型和引用类型这两个概念上的。值类型直接存储数据,而引用类型存储对数据(对象)的引用。理解这两种类型的区别及其转换是管理内存和编写高效代码的关键。.NET 允许开发者创建自定义异常类,这些类通常继承自类。

weixin_35257663的博客 924

NET CLR via C#读书笔记 - 第八章 方法

NET CLR via C#读书笔记 - 第八章 方法1 实例构造器与引用类型(类)2 实例构造器和值类型(结构)3 类型构造器4 操作符重载方法5 转换操作符方法5.1 转换操作符方法描述5.2 转换操作符方法重载6 扩展方法7 分部方法 1 实例构造器与引用类型(类)   ① 构造器是将类型实例初始化为良好状态的特殊方法。   ② 元数据表中名字为.ctor   ③ 创建引用类型时,首先为实例的数据字段分配内存并将分配的内存字节初始化为0,其次初始化附加字段(类型对象指针和同步块索引),最后调用实例构造

CreateNewWorld的博客 329

《CLR via C# 第四版》配套示例源码深入分析

NET类型系统允许开发者使用两种类型的对象:引用类型和值类型。引用类型存储在堆上,而值类型存储在栈上或作为结构体的成员存储在堆上。引用类型包括类、接口、委托、数组等;值类型包括基本数据类型、枚举以及结构体。.NET允许开发者创建自己的异常类型,以便更加具体地表示应用程序中可能发生的特定错误。自定义异常通常继承自类或其子类。创建自定义异常时,推荐在构造函数中使用来调用基类的构造函数,以便提供有用的错误信息。

weixin_35752122的博客 1073

NET CLR via C#读书笔记 - 第十二章 泛型

NET CLR via C#读书笔记 - 第十二章 泛型1 泛型简介2 开放类型和封闭类型3 泛型类型和继承4 泛型类型同一性5 可验证性和约束5.1 主要约束5.2 次要约束5.3 构造器约束5.4 泛型类型变量转型5.5 泛型类型变量设为默认值5.5 泛型类型变量与null比较5.6 两个泛型变量作比较5.7 不要将泛型类型变量作为操作数使用 1 泛型简介   泛型是另一种形式的“代码重用”,或者说“算法重用”。开发者可以定义好算法,排序,搜索,交换等,但是这些算法的数据类型却不会事先指定,而是由使用者

CreateNewWorld的博客 309

NET CLR via C#高清中文版 (第4版)

针对 CLR和.NET Framework 4.5进行深入、全面的探讨, 并结合实例介绍了如何利用它们进行设计、开发和调 试。全书5部分共29章。第Ⅰ部分介绍CLR基础,第Ⅱ 部分解释如何设计类型,第Ⅲ部分介绍基本类型,第 Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处 理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能应用程序。

.NET CLR via C#(第4版) 最新完整版 高清文字版

是第4版 正式版 不是prepress版。 本书是全球享有盛誉的技术作家Jeffrey Richter的经典书籍CLR via C#最新版第四版。 本书针对clr、C#5.0和.net framework 4.5进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。 本书深入、全面探讨.NET Framework、CRL和多核编程,广泛讨论FrameworkClassLibrary(FCL)核心类型,对泛型和线程处理等深奥 难懂的开发概念提供权威、实用的指导。

CLRvia3读书笔记

CLRvia3读书笔记

Jack_software的专栏 1751

NET CLR via C#(第4版)中文版(百度网盘链接地址)

NET CLR via C#(第4版)中文版(百度网盘链接地址)

.NET:CLR via C# Thread Basics

A thread is a Windows concept whose job is to virtualize the CPU. Thread Overhead Thread kernel object The operating system allocates and initializes one of these data structures for each thread c...

weixin_34194317的博客 156

NET CLR via C#(中文第4版)-完整版-5

CLR via C# (中文第4版) 完整版-第四卷,共5卷,请在点击上传作者账户资源进行完整下载(csdn最大只能传70MB的文件)

QMT量化交易桥接方案深度对比:从MiniQMT淘汰说起

量化交易系统中的API桥接,本质是解决本地终端与底层交易引擎之间的通信瓶颈。其核心原理在于绕过GUI封装、直连确定性执行层,从而获得低延迟、高可靠、可监控的指令通路。技术价值体现在策略实盘一致性提升、毫秒级响应保障及运维可控性增强。典型应用场景包括打板策略、T+0套利、高频网格等对时效与稳定性双敏感的自动化交易。本文聚焦国金证券QMT专业版生态,系统剖析DLL注入、HTTP反向代理、IPC共享内存与官方HTTP API四大桥接路径的性能边界、合规风险与工程落地成本,尤其深入解析qmt终端 client is

weixin_33892359的博客 457

《CLR via C#》读书笔记-.NET多线程(三)

主要记录了CLR线程池的基本知识、CLR线程池的几个常用方法,以及执行线程与辅助线程的上下文的“流动”,对应《CLR via C#》的26.1-26.3小节

郑林的专栏 981

别再只画版图了!用ADS RFPro的Circuit模型,快速评估滤波器加电容后的性能变化

本文详细介绍了如何利用ADS RFPro的Circuit模型功能,实现射频滤波器设计中版图与集总元器件的高效协同仿真。通过混合仿真技术,工程师可以快速评估滤波器加电容后的性能变化,大幅缩短设计迭代周期,提升工作效率。文章还提供了实战案例和高级技巧,帮助读者掌握这一创新设计方法。

weixin_28559803的博客 256

《CLR Via C#》第一章

大致介绍了CLR执行应用程序的流程,编译代码流程,介绍了IL、元数据和程序集的关系。

weixin_51374560的博客 964

[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--地图(一)

上面3章图是完成后的效果图 游戏已完成,除了英雄外,基本还原了90%的游戏内容,一共13关,20种防御塔,30+种敌人,如上图,以假乱真吧 下面从地图模块起介绍我的方法,如有更好的方法,请留言一起讨论,游戏资源下载原版游戏数据包,解压即可 推荐一款软件,TextureUnpackerRelease1.04可以分割plist形式的图片,提高效率 经过一个月学习也发现之前有很多化简为繁的错误

7172

遇到一个诡异的WiFi网络问题:同一个办公室苹果电脑上不了网,其他电脑都可以

先来把问题掰开揉碎地看清楚:在一个普通的办公室WiFi网络中,所有设备——Windows电脑、安卓手机、甚至是那台老旧的Linux服务器——都能正常联网,唯独苹果电脑(可能是MacBook、iMac或者Mac mini)像被下了魔咒一样,连不上网。这种情况不仅让人抓狂,还透着一股神秘感。为什么偏偏是苹果电脑?难道WiFi路由器对苹果有“偏见”?这些症状都指向一个核心问题:苹果电脑与办公室WiFi之间,似乎存在某种“沟通障碍”。但这障碍到底出在哪里呢?是苹果电脑自己的问题,还是网络设置在“针对”它?

网络技术联盟站 836

CLR via C# 第一章 CLR的执行模型

CLR via C# 第一章读书笔记

qq_41044598的博客 756

C#上位机实战:Modbus RTU串口通信(CRC校验+超时重发完整实现)

在工业自动化上位机开发中,Modbus RTU是串口通信的事实标准协议,SerialPort是 .NET 平台操作串口的原生类,无需依赖第三方库即可实现基础通信。实际项目中,工控现场存在电磁干扰、串口丢包、设备响应延迟等问题,CRC 数据校验用于保证报文完整性,超时重发机制用于提升通信稳定性。本文从零封装一套可直接落地的 Modbus RTU 通信组件,包含完整的校验算法、超时控制、重发逻辑,并配套 WinForm 演示界面。本文基于 C# 原生SerialPort类,实现了一套生产可用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 384

CLR基础之一---认识CLR [《CLR via C#》读书笔记]

《CLR via C#》读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称。这是通用语言架构(简称CLI)的微软实现版本,它定义了一个代码运行的环境。CLR运行一种称为“通用中间语言”的字节码,这个是微软的通用中间语言实现版本。 CLR运行在微软的视窗操作系统上...

weixin_30872499的博客 2241

基于simulink的电动汽车电机驱动系统IGBT开路故障检测

本文介绍了基于Simulink的电动汽车电机驱动系统IGBT开路故障检测方法。通过搭建永磁同步电机(PMSM)驱动系统模型,实现IGBT开路故障注入,并设计基于电流平均值与PWM逻辑比较的故障检测算法。系统可实时采集三相电流信号,通过MATLAB Function模块实现故障诊断,当检测到PWM信号与电流不匹配时输出故障报警。仿真结果显示,系统能在2.05秒内准确识别A相上管开路故障,并通过Scope和XYGraph直观展示故障特征。该方法为电动汽车电力电子系统故障诊断与容错控制提供了实用解决方案,后续可扩

xiaoheshang_123的博客 149

电机驱动器MP6540H应用设计

/ ... 其他初始化函数(SystemClock_Config, MX_GPIO_Init, MX_TIM1_Init, MX_TIM2_Init)需要你根据STM32CubeMX生成或手动编写。// 假设霍尔传感器引脚是 GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_10。// 低侧U相GPIO引脚。

zhusl6688的博客 656

CLR via C#:CLR执行模型

CLR简介:CLR也叫做公共语言运行时,只要编程语言(C#,Lua,IL等)是面向CLR规范的,那么这些编程语言也就具有CLR中定义的能力(内存管理,程序及加载,安全性,异常处理和线程同步等)。 执行模型:以C#编程语言为例,执行过程如下所示: 1.使用C#编写源代码文件。 2.使用C#编译器将C#源代码文件编译成托管模块。 1>>.编译器主要做语法检查以及分析源代码工作。 2>...

zjz 433

[内网基础] 内网基础知识 —— Windows 工作组

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知的。Windows 为了解决这一问题,就产生了工作组(Work Group)这个概念。Windows 工作组尝试将不通的计算机按功能(或部门)分别列入不同的工作组,例如技术部的计算机都列入 “技术部” 工作组、行政部的计算机都列入 “行政部” 工作组。要想访问某个部门的资源,只要在 “网络” 里双击该部门的工作组名,就可以看到该部门里的所有计算机了。

Blue17 の 小窝 1601

【亲测免费】 深入探索.NET CLR:《CLR via C》第4版资源推荐

深入探索.NET CLR:《CLR via C#》第4版资源推荐 【下载地址】CLRviaC第4版中英文版资源下载 - **书名**: CLR via C# 第4版- **语言**: 中文版 & 英文版- **格式**: PDF- **特点**: 高清无水印 ...

gitblog_09724的博客 786

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

CLR via C# 第一章—第十三章

方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。每个可选形参都有一个默认值作为其定义的一部分。如果没有为该形参发送实参,则使用默认值。

2301_79124729的博客 1198

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《CLR via C#》笔记:第1部分 CLR基础

C#入门书籍,这本书其实更像是“字典”,所以我就对重点内容以及其中专业术语进行了补充和总结,其余内容只提供了一个页数索引。开篇三章主要讲了CLR原理以及打包相关的原理。

sugarsama的博客 1050

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: NET CLR via C#读书笔记 - 第四章 类型基础
下一篇: NET CLR via C#读书笔记 - 第五章 基元,引用和值类型
藏海花鸣
博客等级 码龄8年 40粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值