C#中CLR(公共语言运行时)与IL(中间代码)

C#编码中间语言IL,也称为 MSIL 或 CIL C# 是一种编译型语言,它的源代码(.cs 文件)首先被编译成中间语言(IL,也称为 MSIL 或 CIL,即 Microsoft Intermediate Language),然后这个中间语言代码通常被封装在一个程序集(.dll 或 .exe 文件)中。这个过程是由 C# 编译器(如 csc.exe,它是 Microsoft .NET Framework SDK 的一部分)完成的。 阅读详情

.net平台中的CLR

首先要说明的是,.NET平台与C#不是一回事 它是C#,VB.net等程序运行的平台。

CLR是公共语言运行时,是 .NET Framework的重要组成部分。它提供了内存管理、线程管理和异常处理等服务,而且还负责对代码实施严格的类型安全检查,保证了代码的正确性。

事实上,类型安全(Type Checker)、垃圾回收(Garbage Collector)、异常处理(Exception Manager)、向下兼容(COM Marshaler)等很多C#中的特性都是由CLR来提供的。

什么是IL

.NET Framework是架构在Windows平台上的一个虚拟的运行平台,你可以想象将最下层Windows换做其他的操作系统,例如说Linux,一样可以实现使用符合CLS(Common Language Specification,通用语言规范)的.NET语言,这其实就是Mono计划要实现的功能。因而,理论上,C#是一种可以跨平台的语言。

C#另一个比较象Java的地方是,它也是一种(特殊意义上的)语言,同Java一样,C#编写的程序代码也是先通过C#编译器编译为一种特殊的字节代码, (Microsoft Intermediate Language,MSIL,微软)中间语言,运行时再经由特定的编译器(JIT编译器,Just In tIME, JITer)编译为机器代码,以供操作系统执行。(关于JIT的介绍。可以看这篇博客,请点这里)

IL是一门中间语言 ,.NET平台上的各种高级语言(如C#,VB,F#)的编译器会将各自的文字表述方式转化为IL。各种不同的文字形式最终被统一到了IL的表述方式

CLR加载了IL之后,当每个方法第一次被执行时,就会使用JIT将IL代码进行编译为机器码,机器码和汇编其实也是一一对应的,可以这样理解:汇编是机器码的文字表现形式,提供了一些方便人们记忆的“助记符”。

对于同样的IL,JIT会把它为不同的CPU架构(如x86/IA64等等)生成不同的机器码。

C#代码及其对应的IL中间代码

这里写图片描述

//hidebysig指令表示如果当前类为父类,用该指令标记的方法将不会被子类继承
//cil managed表明方法体中的代码是IL代码,且是托管代码,即运行在CLR运行库上的代码
.method private hidebysig static void Main(string[] args)cil managed
{
    .entrypoint //该指令代表该函数程序的入口函数。每一个托管应用程序都有且只有一个入口函数,CLR加载程序时,首先从.entrypoint函数开始执行。
    .maxstack 2 //执行构造函数时,评估堆栈可容纳数据项的最大个数。评估堆栈是保存方法中所需要变量的值的一个内存区域,该区域在方法执行结束时会被清空,或者存储一个返回值。
    .locals init (
        [0] int32 num,
        [1] int32 num2,
        [2] int32 num3) //表示定义int类型的变量,变量名分别为num,num2,num3。存储在调用栈。
    L_0000: nop  //No operation的意思,即没有任何操作。
    L_0001: ldc.i4.1  //将“1”压入评估栈,此时“1”处于评估栈的栈顶。
    L_0002: stloc.0  //此指令表示把值从评估栈中弹出,并赋值给调用栈的第0个变量num。
    L_0003: ldc.i4.2 
    L_0004: stloc.1 
    L_0005: ldc.i4.3 
    L_0006: stloc.2 //从.locals init到L_0006,相当于C#代码的为i,j,k赋值。
    L_0007: ldloc.0  //取调用栈中位置为0的元素压入评估栈(取i的值)。
    L_0008: ldloc.1  //取调用栈中位置为1的元素压入评估栈(取j的值)。
    L_0009: add  //做加法操作
    L_000a: ldloc.2 //取调用栈中位置为2的元素压入评估栈(取k的值)。
    L_000b: add  //做加法操作
    L_000c: call void [mscorlib]System.Console::WriteLine(int32) //调用输出方法
    L_0011: nop  //No Operation
    L_0012: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() //调用ReadKey方法
    L_0017: pop //把评估栈的内容清空
    L_0018: ret  //return 标记返回值
} //Main方法结束

通过上面的代码,我们可以总结一下: .maxstack:代码中变量需要在调用栈(Call Stack)中占用几个位置; .locals int(……):定义变量初始化并放入调用栈中(Call Stack); nop:No Operation,没有任何操作; ldstr:Load String,把字符串压入评估栈(Evaluation Stack)中; ldc.i4.1:把数值2以4字节长度整数的形式压入评估栈; stloc:把评估栈(Evaluation)中的值弹出赋值到调用栈中(Call Stack); ldloc:把调用栈(Call Stack)中指定位置的值取出(Copy)压入评估栈(Evaluation Stack)中; call:调用指定的方法,这个指令一般用于调用静态方法;而callvir则一般用于调用实例方法; ret:return ,标记返回。

下面再看一个例子


 namespace TestConsole
{
    class Program
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        private static void SomeMethod()
        {
            Console.WriteLine("Hello World!");
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Before JITed.");
            Console.ReadLine();

            SomeMethod();

            Console.WriteLine("After JITed");
            Console.ReadLine();
        }
    }
}

与之相对应的main方法IL代码:

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 8
    // 分配字符串"Before JITed"
    L_0000: ldstr "Before JITed."
    // 调用Console.WriteLine方法
    L_0005: call void [mscorlib]System.Console::WriteLine(string)
    // 调用Console.ReadLine方法
    L_000a: call string [mscorlib]System.Console::ReadLine()
    L_000f: pop 
    // 调用Program.SomeMethod方法
    L_0010: call void TestConsole.Program::SomeMethod()
    // 分配字符串"After JITed"
    L_0015: ldstr "After JITed"
    // 调用Console.WriteLine方法
    L_001a: call void [mscorlib]System.Console::WriteLine(string)
    // 调用Console.ReadLine方法
    L_001f: call string [mscorlib]System.Console::ReadLine()
    L_0024: pop 
    L_0025: ret 
}

c++ 界面化编程 CLR 刚开始找界面化编程实现方法的时候大多推荐的QT和C#,于是去下载了QT和C#来用,用了一些时候,做了一些比较,有点自己的想法,希望能用C#的设计器搭配C++的语法,刚好看到论坛上有实现方法,于是就完成了折腾,以后如果有人说C++只有控制台,就可以很淡定的告诉别人继续深入学习C++就会发现不止有控制台,还有有很方便的界面。 以下是在VS2019上实现的,和VS2017实现的方法... 阅读详情

相关推荐

公共语言运行时(CLR)

公共语言运行时(CLR)是.NET 框架的核心组成部分,在 2024 年 11 月 15 日这个时间节点,它依然在众多软件开发场景中发挥着至关重要的作用。CLR 就相当于执行和运行我们所编写程序的环境和服务,如同赛车依赖跑道才能飞驰,CLR 对于程序就如同跑道对于赛车。在 Java 平台中,程序员向电脑部署软件时需安装 JVM(Java 虚拟机),而在.NET 平台,CLR 就相当于 JVM。

百态·数智思维 | 聚焦大数据、量化与未来AI 1215

浅谈C#中IL

一、前言 IL是什么?  Intermediate Language (IL)微软中间语言 C#代码编译过程? C#源代码通过LC转为IL代码,IL主要包含一些元数据和中间语言指令; JIT编译器把IL代码转为机器识别的机器代码。如下图 语言编译器:无论是VB code还是C# code都会被Language Compiler转换为MSIL MSI

爱做菜的炼丹师 4801

C#面:简述 CTS , CLS , CLR , IL

它定义了在.NET平台上所有类型的规范和行为。CTS确保了不同语言编写的代码可以相互交互操作,并且可以在运行时进行类型安全的检查。

那个那个鱼的博客 1820

CLR学习之初识CLR

一、什么是CLR?     CLR即公共语言运行时(Common Language Runtime,简称CRL),就是微软为.net产品构建的运行环境,与java的JVM类似,通俗的讲就是.net虚拟机。CLR上实际运行的并不是我们通常所用的编程语言(例如C#、VB等),而是一种字节码形态的“中间语言”。这意味着只要能将代码编译成这种特定的“中间语言”(MSIL),任何语言的产品都能运...

2020

CLR via C#(一)CLR的执行模型

CLR全称Common Language Runtime,即公共语言运行时。它可以为所有面向CLR的语言提供运行时的内存管理、程序集加载、安全性、异常处理和线程同步等功能。

夜槿笙歌的博客 1132

掌握C#到IL的深度转换

本文还有配套的精品资源,点击获取 简介:《C# to IL》详细阐述了C#语言与.NET中的中间语言(IL)之间的转换关系,揭示了.NET运行时的工作机制。通过理解从C#源代码到IL代码的编译过程,以及IL代码到机器码的JIT编译过程,开发者能够深入理解代码优化、性能分析和异常调试。本书还介绍了C#特性在IL代码中的表示,并探讨了IL在反射机制中的应用。读者将学习到关键的....

weixin_42510243的博客 1374

C#基础之IL

1.实例解析IL   作为C#程序员,IL的作用不言而喻,首先来看一个非常简单的程序和它的IL解释图,通过这个程序的IL指令来简单的了解常见的IL指令是什么意思。 class Program { static void Main(string[] args) { int i = 2; ...

weixin_30398227的博客 596

C# WinForms实战:5分钟用ScottPlot打造专业级示波器界面(附完整代码)

本文详细介绍了如何在C# WinForms应用中,利用ScottPlot.WinForms库快速构建一个专业级的软件示波器界面。通过从环境配置、静态波形绘制到动态数据实时更新的完整实战演示,帮助开发者高效实现高性能的波形显示功能,适用于工业监控、信号分析等多种场景。

weixin_29198045的博客 831

c# 公共语言运行时,C#中CLR(公共语言运行时)与IL(中间代码)

原标题:C#中CLR(公共语言运行时)与IL(中间代码).net平台中的CLR首先要说明的是,.NET平台与C#不是一回事 它是C#,VB.net等程序运行的平台。CLR是公共语言运行时,是 .NET Framework的重要组成部分。它提供了内存管理、线程管理和异常处理等服务,而且还负责对代码实施严格的类型安全检查,保证了代码的正确性。事实上,类型安全(Type Checker)、垃圾回收(Ga...

weixin_42299257的博客 868

互联网金融项目实战(大数据Hadoop hive)

什么是互联网金融? 互联网金融 --> 信贷(信用贷款) --> 支付宝率先搞了一个信用体系 互联网金融: 在线支付、P2P 银行: 只会锦上添画、不喜欢雪中送炭 银行害怕出现坏账 ( 储户存钱,银行放贷 赚个利息差 ) 银行是可以倒闭的 保险公司不允许倒闭 银行分为:商业银行(自生自灭的)和非商业银行(国家的) 中国工商银行 全球第一大行 招商银行(清朝的一个李鸿章) 中国银行(历史超过 100 年了) 国家政策:希望银行能够扶持中小型企业 p2p:网络借贷平台 民间吸纳贷款 -->

weixin_58276266的博客 1553

全差分运放+开关电容共模反馈

设计一种CMOS全差分折叠式共源共栅结构的运放,其共模反馈用的是开关电容(SC-CMFB)。 下面分别是主运放、偏置电路和开关电容共模反馈电路图 在设计时碰到的问题: 1、增益怎么测? 2、输出波形不平滑? 3、开关的时序频率设置多高? 解答: 1、先设计好主运放和偏置电路,使得运放的输出接近VDD/2,且主运放的管子都工作在饱和区,然后再参考何乐年的《模拟集成电路设计与仿真》仿增益。 2、增益仿完后,仿真瞬态,看电路的工作情况,于是将偏置电路上接Vb4与主运放断开,接到共模反馈上的Vbia上,然后就

qq_36686804的博客 1万+

.NET 公共语言运行时(Common Language Runtime,CLR)

NET 的公共语言运行时(CLR)是 .NET 应用程序执行的基础,负责管理代码的执行、内存管理、安全性和异常处理等功能。CLR 提供了一种高效、可靠的运行时环境,使得开发者能够专注于应用程序的逻辑,而不必过多关注底层的内存管理和类型安全等问题。通过 JIT 编译和自动垃圾回收,CLR 确保了 .NET 应用程序的性能和安全性,成为现代应用程序开发的强大工具。

weixin_49784554的博客 1571

避开这5个坑!ADNI数据库下载实操经验分享(含断点续传方案)

本文分享了ADNI数据库下载的5个常见陷阱及解决方案,包括高级搜索策略优化、断点续传技巧和数据完整性验证。特别针对大文件下载中断问题,提供了wget断点续传和分卷下载的实操方法,帮助研究者高效获取神经影像数据,避免重复下载和时间浪费。

git9versioner的博客 373

《CLR via C#》CLR基础

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

陈云佳的专栏 3758

用长tree方式做等长线

1)写一个sdc,把等长线的起点设置成clock source,用于创建create_clock,至于period和waveform等参数随便写即可。然后clock_opt -from build_clock -to route_clock即可。3)在正式cts之前或之后,给自己创建的scenario长tree并don't touch。前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。2)为该clock创建一个新mode,并创建对应的scenario。

m0_61544122的博客 622

基于STM32F4XX 、HAL库的SHT40-CD1B-R3温湿度传感器驱动应用C语言程序设计

define SHT40_ADDR_READ 0x8B // CD1B 读地址 ((0x45 << 1) + 1)#define SHT40_ADDR_WRITE 0x8A // CD1B 写地址 (0x45 << 1)// 初始化 I2C1 (根据 CubeMX 生成的函数)// 湿度: -6%RH + 125%RH * (raw / 2^16)// 温度: -45°C + 175°C * (raw / 2^16)// 返回值: 0=成功, 1=失败(CRC错误或I2C通信错误)

PP_Cottage的博客 236

c# IL 入门

看下面这个例子: using System; using System.Collections.Generic;   namespace ConsoleApplication3 {     class Program     {         delegate void Printer();         //代理相当于一个类型         static void Pr...

icebergliu1234的博客 1万+

SAP ABAP 如何实现物料主数据接口的增量传输机制?

如何实现物料主数据接口的增量传输机制?我在各客户系统中看到了五花八门的实现方式,即使是 IBM 实施的开发质量也并没有保证。其实这是一个很简单的问题,下面以物料主数据接口为例子,介绍 SAP 中更改文档对象的接口数据增量传输机制。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1316

公共语言运行库 c#,C#技术漫谈之公共语言运行库(CLR)

原标题:C#技术漫谈之公共语言运行库(CLR)概述.NET Framework的核心是其运行库的执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR的控制下运行的代码称为托管代码(managed code)。但是,在CLR执行编写好的源代码之前,需要编译它们(在C#中或其它语言中)。在.NET中,编译分为两个阶段:1、把源代码编译为Microsoft中间语言(IL)。2、CLR把...

weixin_35158372的博客 1013

efm32 入门.pdf

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

语言独立性:公共语言运行时

本章介绍一些基本概念,譬如程序集、元数据和公共语言运行时(CLR)。你将会了解到如何编写客户端和类库程序集,以及某一程序集的客户端如何使用另一程序集中的二进制组件。本章随后讨论了.NET如何实现二进制兼容,同时展示了.NET如何支持先前章节介绍过的这一面向组件的核心原则。 语言独立性:公共语言运行时 Language Independence: The CLR .NET CLR提供一个公共上

moshengtan的专栏 1970

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CLR简介

CLR简介 什么是CLR CLR英文全称Common Language Runtime,即公共语言运行时。 乍一看到这个概念确实不明白,什么是语言运行时? 简单来说,就是一个程序运行所需要的环境,包括各种资源、各种操作等等。 通常来说,不同语言、不同操作系统所需要的运行时环境都不一样。举个例子,Windows上的可执行程序都被包装成了.exe格式,而这种.exe格式文件提供了一个程序从加载到运行所需要的所有资源和环境。 而CLR提供了: 1、一个支持GC的虚拟机,该虚拟机有自己的一套指令集,即CIL(公共

weixin_42186870的博客 1万+

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

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

c# 深入探索之CLR

概念: CLR: 公共语言运行时(Common Language Runtime) 是一个可由多种编程语言使用的"运行时",它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR的核心功能(内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 通俗一点说就是:不管是c# 、c++、 vb、f#、甚至是java等各编译器面向CLR的...

weixin_40715466的博客 904

.net core底层入门学习笔记(一-介绍与IL)

草稿: 1.await 关键字会自动记录当前的同步上下文,回调时会自动在之前的线程上下文中进行回调。

kylinok的博客 2841

公共语言运行库(CLR)

.NET FrameWork的核心是其运行库执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR控制下运行的代码称为托管代码(mamaged code)。但是,在CLR执行编写好的源代码(在C#中或其他语言中编写的代码)之前,需要编译它们。在.NET中,编译分为两个阶段:(1)把源代码编译为Microsoft中间语言(IL)。(2)CLR把IL编译为平台专用的代码。这个...

925

中间语言(IL)

 一、IL与汇编语言IL是微软.NET平台上衍生出的一门中间语言,.NET平台上的各种高级语言(如C#,VB,F#)的编译器会将各自的代码转化为IL。,其中包含了.NET平台上的各种元素,如“范型”,“类”、、“接口”、“模块”、“属性”等等。值得注意的是,各种高级语言本身可能根本没有这些“概念”在里头,如IronScheme是一个在.NET平台上的Scheme语言实现,其中根本没有前面提到的

dodream的专栏 1万+
上一篇: Java中的JIT机制对运行速度的优化
下一篇: VIM不正常退出产生的swp文件
lxydo
博客等级 码龄12年 98粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值