一、引言

我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢?
其实运行原理是一样的,.NET中的虚拟机是CLR(公共语言运行时),无论是C#程序还是VB程序,首先会由CLR编译成与平台无关的中间语言IL,

然后由公共语言运行时(CLR)的(JIT)编译成机器代码,再由CPU去执行它。所以说.NET程序也是需要二次编译才能运行。

  1. IL/MSIL (Microsoft Intermediate Language) :微软中间语言 ,IL是MSIL的缩写,译为中间语言,.NET程序下的所有语言都会编译成中间语言,所以他们之间可以相互调用,与语言无关;
  2. CTS (Common Type System):通用类型系统CLS,通用的数据类型系统,比如C#调用VS语言程序,随便他们各自的数据类型定义不一样,但是最终都会转化为通用类型,比如c#中的int,VB语言中的integer,在CLS中都会转化为System.int32,所以这两者之间的程序可以相互调用;
  3. (Common Language Specification):公共语言规范
  4. CLR (Common Language Runtime):公共语言运行时,也有的叫公共语言运行库
  5. JIT (Just in time):即时编译器

二、控制台程序项目结构解释

为了更好的分析.NET程序的运行原理,首先我们在VS2019中新建一个控制台应用程序,名称为:MyFirstAPP,成功后,我们可以看到系统为我们创建了以下结构:

这些文件结构的基本含义为:

(1)Properties文件夹:(属性文件夹)

AssemblyInfo.cs文件:这个主要保存程序发布后的版权信息,我们点击   属性=》 程序集信息 可以相关信息。

(2)引用:这是我们可以添加其他应用程序集,比如系统类库、其他项目或者模块的类库,Webservice服务等

(3)Program.cs 文件: 这个是项目自定义的代码类,打开以后,我们看到如下代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MyFirstApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("HelloWorld!");
}
}
}

我们大概分析一下系统默认生成的这些代码:

  1. using表示引用命名空间。如果我们需要引用其他类库的中代码,需要添加引用,相当于Java中的import,如果不使用using引入命名空间,那么我们使用类的时候,就需要通过“命名空间.类名”方式使用;
  2. namespace表示声明命名空间。命名空间是用来组织和重用知代码的,我们所有的类必须要归到指定的命名空间中。
  3. class表示声明类。命名空间中包括类,类是.net程序基本运行单元。
  4. static void Main(string[] args)表示声明一个静态方法,方法名称为Main,args表示命令参数,这个方式不能修改,否则程序将不能启动,因为这是整个程序的入口点。

三、.NET项目编译

我们点击编译,然后打开项目文件夹,发现系统生成了三个文件,这三个文件的含义如下:

  1. exe文件:编译后生成的可执行文件,里面是MSIL中间语言。项目发布或给用户可以直接运行的程序。
  2. dll文件:编译后生成的动态链接库文件。里面也是MSIL中间语言。
  3. pdb文件:包含了编译后程序指向源代码的位置信息,用于调试的时候定位源码,方便调试。

我们把MyFirstApp.dll文件通过ildasm中间语言工具打开,可以看到这个程序的整个结构如下:

然后双击main函数,可以看到该函数的中间语言表示如下:

四、运行过程

第一步:我们上面的程序在编译的时候,.NET会生成不依赖于操作系统和特定的CPU的中间语言,而中间语言

是可以在各个操作系统上都能编译的代码,这种代码Java里面叫做ByteCode(字节码),.NET

里面我们称之为MSIL指令(微软中间语言)这是程序编译的第一步。

第二步:不管是Java的字节码还是.NET的MSIL指令是不能直接运行的,因为机器只能之别用0和1表示的机器语言

所以CLR里面的JIT需要将上面的MSIL在一次编译成CPU能够执行的机器指令,最终由电脑执行。整个过程如下图所示:

五、总结

以上是本次分享的内容,有些地方可能不一定正确,欢迎大家批评指正

作者 高红斌
联系QQ 2358643757
出处 https://www.cnblogs.com/gaohongbin
本文版权归作者和博客园共有,如需全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。

最新文章

  1. 关于JQ的$.deferred函数。参考网络文档
  2. linux软件的安装,更新与卸载
  3. EASYUI+MVC4通用权限管理平台--前言
  4. pyqt时间
  5. T-SQL 游标
  6. 总结:liunx常见命令集合
  7. linux下文件搜索
  8. android:onTouch()和onTouchEvent()的区别?看完这篇文章就知道了
  9. webpack以及loader 加载命令
  10. C语言程序设计第一次作业 冯亚杰
  11. 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
  12. [VB]常用函数
  13. VisualStudio2017密钥(key)我随便输入一下居然通过了?????????!!!!!!!!!!!!
  14. 2018.10.26 NOIP训练 数数树(换根dp)
  15. nmon 及nmon analyser工具使用简介
  16. 在linux下 用p7zip 命令行下 解压 iso文件
  17. yii源码一 -- CComponent
  18. Map的复制
  19. php调试利器Xhprof的安装与使用
  20. bzoj2301-Problem b

热门文章

  1. 如何解决flutter中gradle慢的问题
  2. 这才是Android设置界面的正确做法👌👌👌
  3. CDN百科第四讲 | 如何优雅地在云上“摆摊”——做直播带货,你不得不关注的技术
  4. Vmware的各版本KEY
  5. selenium(2)-selenium针对浏览器的操作有哪些
  6. Linux性能优化思路
  7. 多语言工作者の十日冲刺<6/10>
  8. 你所不知道的redis安装方法,穿一手鞋,看一手资料
  9. SpringBoot -- 项目结构+启动流程
  10. java中“”==“” equals hashcode的关系