.NET程序运行原理及基本概念详解

摘要:
类表示声明类:命名空间包含类,这些类是的基本运行单元。net程序。

一、引言

我们知道在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):通用的数据类型系统,比如C#调用VS语言程序,虽然他们各自的数据类型定义不一样,但是最终都会转化为通用类型,比如c#中的int,VB语言中的integer,在CLS中都会转化为System.int32,所以这两者之间的程序可以相互调用;
  3. CLS(Common Language Specification):公共语言规范;
  4. CLR (Common Language Runtime):公共语言运行时,也有的叫公共语言运行库;
  5. JIT (Just in time):即时编译器。

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

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

.NET程序运行原理及基本概念详解第1张

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

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

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

.NET程序运行原理及基本概念详解第2张

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

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

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace MyFirstApp
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Console.WriteLine("HelloWorld!");
14         }
15     }
16 }

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

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

三、.NET项目编译

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

.NET程序运行原理及基本概念详解第3张

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

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

.NET程序运行原理及基本概念详解第4张

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

.NET程序运行原理及基本概念详解第5张

四、运行过程

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

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

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


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

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

.NET程序运行原理及基本概念详解第6张

五、总结

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

微信名片

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

免责声明:文章转载自《.NET程序运行原理及基本概念详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unreal Engine 4 中的 UI 优化技巧逻辑漏洞小结之SRC篇下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android Verified Boot 2.0简要

from: https://ressrc.com/2018/10/26/android-verified-boot-2-0%E7%AE%80%E8%A6%81-thanksgining/   简要 AVB2.0被用于启动引导,此用法添加一个“vbmeta.img”镜像。public key被编译到bootloader中用于校验vbmeta数据,vb...

Ubuntu16 编译源码安装MXNet 可变卷积Deformable-ConvNets GPU版

【引言】最近接手了公司的关于虫子识别的项目,使用MXNet框架开发,但是实际用的是Deformable-ConvNets. Deformable-ConvNets为微软研究研究院提出的可变卷积网络,可用于对图像中大小不一的物体识别,不是单单识别图中的猫和狗(它们都一般大小),而识别图像中不同种类的虫子(虫子本身小,而且难以区分),在这样的场景下很适合用可变...

Linux及ArmLinux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beerhttp://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一、Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发...

【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介  1. 内核功能简介 (1) 操作系统 和 内核 简介 操作系统 :  -- 功能 : 完成基本功能 和 系统管理; -- 组成 : 内核(kernel), 设备...

Win7+VS2005编译Qt4.7.3+phonon(需要安装新版本Windows SDK)

Qt官网上下载的源代码在编译时并没有将phonon继承进去,只提供了源代码,而在Win7+VS2005中编译phonon时遇到不少的问题,因为phonon只是一个前端程序,要使用其实现多媒体的播放还需要配合Qt基本库、phonon_backend(后端插件)和多媒体播放后台等等。 phonon只提供了一套API接口给客户端程序调用,同时为后端插件提供一个规...

C# 基于任务的异步模式的创建与使用的简单示例

C# 基于任务的异步模式的创建与使用的简单示例对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法。 1.创建一个拥有异步方法的类 该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带Async后缀 public class Dog { public Task DoSom...