CLR在。网络平台
首先。NET平台和C#不一样,它是C#、VB.net等程序运行的平台。
CLR是公共语言运行库,也是。. NET框架。它提供内存管理、线程管理、异常处理等服务。它还负责对代码实施严格的类型安全检查,确保代码的正确性。
事实上,许多C#特性,如类型检查器、垃圾收集器、异常管理器和向后兼容性,都是由CLR提供的。
什么是IL
那个。NET框架是基于Windows平台的虚拟运行平台。你可以想象用其他操作系统比如Linux代替最底层的Windows,可以实现对。符合cls(公共语言规范)的. NET语言,这其实是Mono打算实现的功能。所以理论上C#是跨平台语言。
C#更像Java的另一个地方是,它也是一种语言(特殊意义上)。与Java一样,C#编写的程序代码首先由C#编译器编译成一种特殊的字节码(微软中间语言,MSIL,微软)中间语言,然后由特定的编译器(JIT编译器,JIT)在运行时编译成机器码用于(JIT入门。你可以看这个博客,请点击这里)
IL是一种中间语言,各种高级语言(如C#,VB,F#)的编译器都在上面。NET平台会把自己的文字表达式转换成IL。各种形式的文字最终统一到了IL的表达中
CLR加载IL后,第一次执行每个方法的时候,都会用JIT把IL代码编译成机器码。机器码和汇编其实是一一对应的。可以理解为汇编是机器码的字面表达,提供了一些助记符让人记忆。
对于同一个IL,JIT会为不同的CPU架构生成不同的机器码(比如x86/IA64等。).
C #代码及其对应的IL中间代码

C#
一个
2
三
四
五
六
七
八
九
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//hidebysig指令表示如果当前类是父类,则用该指令标记的方法不会被子类继承
//cIL托管表示方法体中的代码是IL代码和托管代码,即运行在CLR运行时的代码
。方法private hidebysig StaticyVintMain(string[]args)cil managed
{
。entrypoint//这个指令代表函数程序的入口函数。每个托管应用程序只有一个入口函数。当CLR加载应用程序时,它从。入口点函数。
。maxstack2//执行构造函数时,计算堆栈可以容纳的最大数据项数量。评估堆栈是存储方法中所需变量值的内存区域,在方法执行结束时将被清除空,或者存储返回值。
。局部变量初始化(
[0]int32 num,
[1]int32 num2,
[2]int32 num3)//表示定义int类型的变量,变量名分别为num,num,num2,num3。存储在调用堆栈中。
L _ L _ 0000:nop//没有操作就是没有操作。
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// from。局部变量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: callvoid [mscorlib]系统。console::write line(int 32)//调用output方法
l _ 0011:nop//无操作
L _ 0012: callvaluetype [mscorlib]系统。consolekeyinfo [mscorlib]系统。console::ReadKey()//调用read key方法
L_0017:pop//清除评估堆栈的内容空
L_0018:ret //return标记返回值
}//主方法结束
通过上面的代码,我们可以总结:。maxstack:代码中的变量需要在调用栈中占据几个位置;。localsint (…):定义变量的初始化,并将它们放在调用堆栈中;Nop:不做手术,不做手术;Ldstr: loadstring,将字符串推入求值堆栈;
Ldc.i4.1:将值2以长度为4字节的整数形式压入求值栈;Stloc:弹出求值栈中的值,赋给调用栈;Ldloc:复制调用栈中指定位置的值,按入求值栈;调用:调用指定的方法。该指令一般用于调用静态方法;Callvir一般用于调用实例方法;Ret:返回,标记返回。
让我们看另一个例子
C#
一个
2
三
四
五
六
七
八
九
10
11
12
13
14
15
16
17
18
19
20
21
22
名称空间测试控制台
{
classProgram
{
[MethodImpl(MethodImplOptions。无链接)]
privatestaticvoidSomeMethod()
{
控制台。写线(“你好世界!”);
}
staticvoidMain(字符串[]参数)
{
控制台。写线(“在JITed之前。”);
控制台。ReadLine();
some method();
控制台。write line(" JiTed后");
控制台。ReadLine();
}
}
}
与之对应的主要方法IL代码:
C#
一个
2
三
四
五
六
七
八
九
10
11
12
13
14
15
16
17
18
19
20
21
22
23
。方法private hidebysig StaticyVintMain(string[]args)cil managed
{
。入口点
. maxstack8
//指定字符串“在JITed之前”
l _ 0000:ldstr“JiTed之前”
//调用控制台。写线方法
L_0005:调用void[mscorlib]系统。控制台::写线(字符串)
//调用控制台。读取线方法
L_000a:调用字符串[mscorlib]系统。控制台::ReadLine()
L_000f:pop
//调用程序。某些方法方法方法
L_0010:调用虚空测试控制台。程序::SomeMethod()
//指定字符串“JITed之后”
l _ 0015:ldstr“JiTed后”
//调用控制台。写线方法
L_001a:调用void[mscorlib]系统。控制台::写线(字符串)
//调用控制台。读取线方法
L_001f:调用字符串[mscorlib]系统。控制台::ReadLine()
L_0024:pop
L_0025:ret
}

1.《clr C#中CLR与IL》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《clr C#中CLR与IL》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/1132533.html