何为中间语言IL?

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

     一直以来,对于.NET与C#之间的关系我都存在着疑惑,为此,今天专门仔细看了一下以前最容易忽略掉的书本“前言”部分,予以澄清:) 

 

     首先,c#的结构和方法论反映了.NET的基础方法论,在很多情况下,c#的特定功能取决于.net的功能,依赖于.net基类。通俗一点说,

     (1).net framework 是一个功能丰富的开发平台,可开发,部署和执行分布式应用程序。

     (2)c#是一个基于现代面向对象设计方法的语言,它本身只是一种语言,不是.net的一部分,只是用它生成面向.net环境的代码。

 

     下面,再说两个知道但不知其所以然的概念,那就是CLR(公共语言运行库)与 MSIL(微软中间语言)。.NET Framework的核心是其运行库的执行环境-----公共语言运行库(CLR),而在CLR控制下运行的代码称为托管代码,而微软,又把这些托管代码命名为MSIL(中间语言)。CLR在执行开发的C#源代码之前,要先编译他们。而在.NET中的编译,一共分为两个阶段:C#代码-->IL-->平台专用的内部机器码。这个过程中的第二阶段(IL-->平台专用的内部机器码),是由CLR来执行的。

     当然了,使用托管代码的优点是显而易见的,主要有以下3个方面:1,平台无关性;2,提高性能;3,语言的互操作性。

 

     C#开发人员应该明白,IL在.NET Framework中的作用是至关重要的,C#代码在执行前要编译为IL,即托管代码。IL主要有5点优势:

 

   (1)面向对象和使用接口:

    .NET接口-----提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。

    语言的互操作性-----用一种语言编写的类能直接与另一种语言编写的类进行通信。所谓通信就是指:用一种语言编写的类应能继承另一 种语言编写的类;一个类应能包含另一个类的实例;一个对象应能调用其他语言编写的另一个对象的方法;对象(或对象的引用)应能在方法之间传递;应能调试不同语言之间调用的方法。

 

   (2)值类型和引用类型之间存在着巨大差别:

    值类型和引用类型的概念一定要清楚,IL提供了许多预定义的基本数据类型,归为值类型和引用类型两大类:

    值类型:变量直接保存其数据,一般存储在堆栈中(如果值类型在引用类型中声明为字段,他们就内联存储在堆中)。

    引用类型:变量仅保存地址,对应的数据可以在该地址中找到,引用类型的实例总是保存在一个名为“托管堆”的内存区域中。

 

   (3)强数据类型:IL的一个重要方面是它基于强数据类型。所有的数据都清晰地标记为属于某个特定数据类型。强数据类型虽然会降低性能,但是它可以在以下4个.NET特有的服务中,提供更好的类型安全:

 

    语言互操作性:CTS(通用类型系统)定义了可以在IL中使用的所有预定义数据类型,它的层次结构反映了IL的单一继承地面向对象方法。

                       CLS(公共语言规范)是一个最低标准级,所有的.NET编译器都必须支持它

    CTS 与 CLS 一起确保语言的互操作性。同时要注意,IL是区分大小写的。

 

    垃圾收集:垃圾收集器用来在.NET中进行内存管理,特别是它可以恢复正在运行中的应用程序需要的内存。

                  垃圾收集器(GC堆):实质:这是一个程序。

                                              目的:清理内存。

                                              方法:所有动态请求的内存都分配到堆上(CLR维护它自己的托管堆,供.NET应用程序使用),

                                              当.NET检测到给定进程的托管堆已满,需要清理时,就调用垃圾收集器(GC)。GC处

                                              理目前代码中的所有变量,检查对存储在托管堆上的对象的引用,确定哪些对象可以从

                                              代码中访问(---即哪些对象有引用)。没有引用的对象就不能在代码中访问,因而被删除。

                 之所以在.NET中使用GC器,是因为IL已经用来处理进程,不能引用已有的对象,只能复制已有的对象,而它又是类型安全的。

 

    安全性:windows只提供了基于角色的安全性,而.NET还提供了基于代码的安全性。

 

    应用程序域:     应用程序域是.NET的一个重要技术改进,它主要用于减少运行应用程序的系统开销,这些应用程序需要与其他程序

                    分离开来,但同时还需要彼此通信。

                         在.NET没有诞生前,可以让多个对象实例共享同一个进程,但是在这种情况下,一旦一个实例运行失败,就有可能

                    导致整个进程的运行失败;或许我们可以把这些实例孤立在不同的进程中,但是这样做会增加相关性能的系统开销。

                         孤立代码的唯一方式就是通过进程来实现:在运行一个新的应用程序时,它会在一个进程环境内运行。windows通过

                    地址空间来分隔进程。每个进程有4GB的虚拟内存来存储其数据和可执行代码。然后,windows利用额外的间接方式把这

                    虚拟内存映射到物理内存或磁盘空间的一个特殊区域中,每个进程都会有不同的映射,即虚拟地址空间块映射的物理内存

                    之间不能有重叠,也就是说,每个进程都应该对应不同的物理内存空间。在一般情况下,任何进程都只能通过指定虚拟内

                    存中的一个地址来访问内存-------即进程不能直接访问物理内存。因此,一个进程不可能访问分配给另一个进程的内存。

                    这样就可以确保任何执行出错的代码不会损害其地址空间以外的数据。进程不能共享任何内存。

                         进程不仅是运行代码的实例相互隔离的一种方式,还可以构成分配了安全权限和许可的单元。

                         进程对确保安全有很大帮助,但是会牺牲掉性能。许多进程常常一起工作,相互通信。如果使一些组件一起工作,但

                    不希望性能有所损失,唯一的方法是使用基于DLL的组件-----让所有的组件都在同一个地址空间中运行(其风险是执行出错

                    的组件会影响其它组件)。为了解决这一问题,就出现了应用程序域的概念:应用程序域是分离组件的一种方式,它不会导

                    致因在进程之间传递数据而产生的性能问题。其方法是:把任何一个进程分解到多个应用程序域中,每个应用程序域大致对

                    应一个应用程序,执行的每个线程都运行在一个具体的应用程序域中。也就是说,一个进程可以包含多个应用程序域,而线

                    程又是与应用程序域一一对应的,所以一个进程可以包含多个线程。当在一个进程中运行多个应用程序时,CLR会检查每个

                    正在运行的应用程序代码,以确保这些代码不偏离它自己的数据区域(应用程序域),保证不发生直接访问其它进程的数据

                    的情况。

                         澄清几个对应关系:

                         (1)进程-------虚拟内存------内存地址(一一对应)

                         (2)线程-------应用程序域------app(一一对应)

                         (3)多个应用程序app可以共享同一个进程

                         (4)但多个进程不能共享同一块内存空间。

 

   (4)使用异常来处理错误:

                何为异常?简单地说,就是代码的某些领域被看作是异常处理程序例程,每个历程都能处理某些特殊的错误情况,异常结构确定

          发生错误情况时,执行进程立即跳到异常处理程序历程上,处理错误情况。

 

 

   (5)使用特性: 在源代码中定义特性,特性与对应数据类型和方法放在一起,和反射技术一起使用。

深入解析Microsoft .NET IL中间语言核心原理与实战应用 一个典型的 IL 源文件由多个层次构成:程序集(Assembly)、模块(Module)、类(Class)、方法(Method)和指令序列。 阅读详情

相关推荐

探索.NET中间语言:IL编辑器深度体验

反编译是一个将已编译的程序(通常是机器码或者中间语言代码)转换回更高级语言源代码的过程。在.NET环境中,这一过程涉及到将IL代码转换回C#、VB.NET或其他.NET支持的语言代码。这个过程不仅仅是一个简单地“翻译”,因为反编译器需要通过分析IL指令和元数据来重构原始的逻辑结构。

weixin_31620365的博客 880

IL(中间语言)

http://blog.csdn.net/dodream/article/details/4726421 一、IL与汇编语言 IL是微软.NET平台上衍生出的一门中间语言,.NET平台上的各种高级语言(如C#,VB,F#)的编译器会将各自的代码转化为IL。,其中包含了.NET平台上的各种元素,如“范型”,“类”、、“接口”、“模块”、“属性”等等。值得注意的是,各种高级语言本身可能根本没有这些

u014605728的博客 7413

华为设备有关用户名密码的策略配置

命令用来开启对密码进行复杂度检查功能,设备默认已经是开启状态。1、密码长度大于等于12位,含数字大小写字母和特殊符号。2、设置密码更换周期为90天。取值范围8-16,默认长度为8位。登录失败后锁定时间大于15分钟。3、登录失败次数小于5次。4、登录超时30分钟以内。

简单的创作,希望可以帮助到跟我一样的学习者! 7840

IL中间语言理解

IL :IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码 IL本身逻辑很清楚,主要是把指令的意思搞明白就好办了。记指令只要记住几个规律就好,大致可分为三类: 1.直观型 Add:将两个值相加并将结果推送到计算堆栈上 Sub:从其他值中减去一个值并将结果推送到计算堆栈上 Ca

weixin_41044151的博客 1611

实战指南:轻松破解DataDome滑块验证码的关键步骤

本文详细介绍了破解DataDome滑块验证码的关键步骤,包括理解其工作原理、准备工作、参数获取与配置、完整破解流程及API调用。通过使用Capsolver服务和模拟真实用户行为,帮助开发者有效绕过这一反机器人机制,同时强调了法律与道德考量。

weixin_30415113的博客 481

Python爬虫实战:逆向解析央视频加密参数(附完整代码)

本文详细解析了央视频加密体系的技术实现,通过Python逆向工程实战演示如何解密动态密钥、AES加密和自定义哈希算法等核心组件。文章提供完整代码示例,涵盖GUID生成、参数构造和异步请求处理,帮助开发者掌握现代视频平台的反爬机制破解方法。

weixin_42532473的博客 1131

什么是IL

1.1 什么是IL   IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码(来源百度) 1.2 为什么要了解IL    在很多时候不明白代码是如何...

birdswillbecomdragon的博客 4976

即插即用系列(代码实践) | CVPR 2025 WPFormer:小波与原型增强Transformer——表面缺陷检测SOTA,专治弱缺陷与杂乱背景

摘要:本文提出了一种基于小波变换和原型增强的Transformer模型(WPFormer),用于像素级表面缺陷检测。该模型针对工业场景中微弱缺陷难以识别和杂乱背景干扰严重的问题,创新性地将小波变换引入Transformer的注意力机制,通过频域信息分离噪声与边缘特征,同时利用原型向量引导查询,实现了更精准的缺陷定位。核心模块包括小波增强交叉注意力(WCA)和原型引导交叉注意力(PCA),适用于工业缺陷检测、伪装目标检测和医学图像分割等任务。代码已开源,支持即插即用集成到现有框架中。

分享顶会顶刊论文即插即用模块 301

.NET语言的编译过程:中间语言(IL)和即时编译器(JIT)

.NET语言的编译: 高级语言 ----编译----> IL中间语言 ----JIT----->汇编语言 .NET语言的编译分为两个阶段.首先高级语言被编译成一种称作IL的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类、异常),这也是这种语言被称为中间语言的原因。IL被打包在DLL或EXE文件中,而DLL和EXE在.NET中的主要区别就是:只有EXE可以直接被运行,而二者都可被某个正在执行的进程动态装载(后文详述)。由于机器的CPU只能执行本地汇编语言,而不

weixin_41044151的博客 1328

利用XGBoost实现短期电力负荷预测

本数据集为某地区2009年-2015年的用电负荷,时间片为每分钟这里我们定义了XGB模型作为实例,来进行模型训练,之后我们会对其使用网格搜索找到最优的参数。

优快云 精品推荐 4495

【智能模型系列】基于Unity和MediaPipe【手部追踪+手势识别】系统开发指南

在本文中,我将详细介绍一个基于MediaPipe的Unity手势识别系统,该系统能够识别多种常见手势(如拳头、点赞、胜利手势等),并提供完整的事件系统来处理手势状态变化。这个系统非常适合用于VR/AR交互、手势控制游戏或任何需要自然用户界面的应用场景。

纯技术流日常开发商业开发记录总结等 586

中间语言(IL)

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

dodream的专栏 1万+

2026年国赛C题微网与外部电网电力调控策略 (三):问题三、问题四滚动预测、实时电价与结果核验

专栏内定期更新ABCDE五题详细思路、代码(含运行结果图)和讲解视频-(11号之前半价):问题三看起来只是多给了一个光伏预报附件,实质上它改变了整道题的信息结构:问题四则是在问题二、问题三之上替换价格来源。问题4-2相当于“确定性计划+实时电价”,问题4-3相当于“滚动预测+实时电价”。物理模型完全不变,改变的是价格序列和费用口径。本文先给出核心结果:从结果看,问题3比问题2多约164.21万元,问题4-3比问题4-2多约168.79万元。主要增量不是“储能没有工作”,而是预测误差、计划偏差和紧急购电造成的

YOLO 343

IL(中间语言)的强大背后大佬是如何运作的

IL作为.NET框架的中间语言,提供了平台无关性和语言间的互操作性,使得开发者能够在不同平台上使用多种语言进行开发。Xamarin则利用Mono框架的优势,支持跨平台开发,尤其是在移动应用开发中,提供了灵活的解决方案。通过将不同语言编译为IL代码,.NET框架实现了语言间的交互操作。这种机制不仅增强了开发的灵活性,还使得像Unity3D这样的开发环境能够支持多种编程语言的混合使用,从而满足不同开发者的需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1251

YOLOv8/v9轻量化优化:剪枝30%+蒸馏提精,模型体积缩至4MB还能跑Jetson

剪枝:用敏感度分析找到“可牺牲的30%”,不碰核心特征;蒸馏:借大模型的“经验”补回精度,甚至反超原始小模型;量化:针对边缘设备特性优化量化策略,把体积和延迟压到最低。如果你的项目卡在边缘部署(速度慢/体积大),按“剪枝→蒸馏→量化”三步走,90%能在Jetson上跑通30FPS+的实时检测。需要轻量化模型文件(v8s/v9s剪枝蒸馏后权重)、剪枝工具和Jetson部署脚本的,评论区扣“轻量化”,直接发你可运行版本~

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 669

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

乱涂IL中间语言

【文章标题】: 乱涂IL中间语言【文章作者】: 有酒醉【作者邮箱】: wuqr32@sina.com【下载地址】: 自己搜索下载【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!--------------------------------------------------------------------------------【详细过程】  一、序      .NET中

2497

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

.Net 中的IL中间语言基本语法

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

aoyao9093的博客 1195

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

il中间语言-张银-博客园

il中间语言-张银-博客园 2012年01月14日   一、IL与汇编语言   IL(Intermediate Language)是微软.NET平台上衍生出的一门中间语言,.NET平台上的各种高级语言(如C#,VB,F#)的编译器会将各自的代码转化为IL。,其中包含了.NET平台上的各种元素,如"范型"、"类"、"接口"、"模块"、"属性"等等。值得注意的是,各种高级语言本身可能根本...

ldi543lc 355

关于IL中间语言的浅谈

在C#开发的语言优化问题上,本人闲的没事干,咳咳。。

u010327824的专栏 562

[C++/CLI编程宝典][6]IL中间语言

继续上节的ildasm.exe对main.exe的IL中间语言的分析。我们知道我们在main.exe中定义了NativeClass,ValueStruct和RefClass。下面我们将做类型与IL中间语言的一一对应:   1)NativeClass C++/CLI代码: CodeCode highlighting produced by Actipro CodeHighlighter (f

http://itech.cnblogs.com 1329

.NET 技术FAQ(八)-----中间语言 (IL)

8. 中间语言 (IL)8.1 我能看到元件的中间语言吗?是的。Microsoft 提供了一个称为 Ildasm 的工具,它可以用来查看元件的 metadata 和 IL。  8.2 能否通过反向工程从 IL 中获得源代码?是的。相对而言,从 IL 来重新生成高级语言源代码 (例如 C#) 通常是很简单的。  8.3 如何防止别人通过反向工程获得我的代码?目前唯一的办法是运行带有 /owner 选

小毛头的BLOG 1521

il中间语言 指令大全

IL指令大全 IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码。 名称 说明 Add 将两个值相加并将结果推送到计算堆栈上。 Add.Ov...

wnagleiming的博客 1047

深度解读.NET中的IL(中间语言):理解编译与运行机制的桥梁

在.NET开发领域,IL(Intermediate Language,中间语言)是连接高级编程语言(如C#、VB.NET等)与底层运行时的关键纽带。深入理解IL,有助于开发者洞察代码在编译和运行时的行为,优化代码性能,解决疑难问题。

dotnethello的博客 539

java中间语言汇编语言_中间语言(IL) | 学步园

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

weixin_35150962的博客 1016
上一篇: 操作系统之基本概念
下一篇: 快捷键总结
Zevin
博客等级 码龄17年 63粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值