.NET程序运行原理及基本概念详解
一、引言
我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢?
其实运行原理是一样的,.NET中的虚拟机是CLR(公共语言运行时),无论是C#程序还是VB程序,首先会由CLR编译成与平台无关的中间语言IL,
然后由公共语言运行时(CLR)的(JIT)编译成机器代码,再由CPU去执行它。所以说.NET程序也是需要二次编译才能运行。
- IL/MSIL (Microsoft Intermediate Language) :微软中间语言 ,IL是MSIL的缩写,译为中间语言,.NET程序下的所有语言都会编译成中间语言,所以他们之间可以相互调用,与语言无关;
- CTS (Common Type System):通用类型系统CLS,通用的数据类型系统,比如C#调用VS语言程序,随便他们各自的数据类型定义不一样,但是最终都会转化为通用类型,比如c#中的int,VB语言中的integer,在CLS中都会转化为System.int32,所以这两者之间的程序可以相互调用;
- (Common Language Specification):公共语言规范
- CLR (Common Language Runtime):公共语言运行时,也有的叫公共语言运行库
- 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!");
}
}
}
我们大概分析一下系统默认生成的这些代码:
- using表示引用命名空间。如果我们需要引用其他类库的中代码,需要添加引用,相当于Java中的import,如果不使用using引入命名空间,那么我们使用类的时候,就需要通过“命名空间.类名”方式使用;
- namespace表示声明命名空间。命名空间是用来组织和重用知代码的,我们所有的类必须要归到指定的命名空间中。
- class表示声明类。命名空间中包括类,类是.net程序基本运行单元。
- static void Main(string[] args)表示声明一个静态方法,方法名称为Main,args表示命令参数,这个方式不能修改,否则程序将不能启动,因为这是整个程序的入口点。
三、.NET项目编译
我们点击编译,然后打开项目文件夹,发现系统生成了三个文件,这三个文件的含义如下:

- exe文件:编译后生成的可执行文件,里面是MSIL中间语言。项目发布或给用户可以直接运行的程序。
- dll文件:编译后生成的动态链接库文件。里面也是MSIL中间语言。
- 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 | ||||||
| 本文版权归作者和博客园共有,如需全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。 | |||||||
.NET程序运行原理及基本概念详解的更多相关文章
- [Spark内核] 第40课:CacheManager彻底解密:CacheManager运行原理流程图和源码详解
本课主题 CacheManager 运行原理图 CacheManager 源码解析 CacheManager 运行原理图 [下图是CacheManager的运行原理图] 首先 RDD 是通过 iter ...
- 第二章--Win32程序运行原理 (部分概念及代码讲解)
学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...
- IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转
转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 前言: 记录 IIS 相 ...
- Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗
1. Java程序运行原理: Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...
- [Spark内核] 第36课:TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等
本課主題 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...
- Android辅助功能原理与基本使用详解-AccessibilityService
辅助功能原理与基本使用详解 本文主要介绍辅助功能的使用 辅助功能基本原理 辅助功能基本配置和框架搭建 辅助功能实战解析 辅助功能基本原理 辅助功能(AccessibilityService)其实是 ...
- Nginx 反向代理工作原理简介与配置详解
Nginx反向代理工作原理简介与配置详解 by:授客 QQ:1033553122 测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...
- 使用openURL实现程序间带参数跳转详解
使用openURL实现程序间带参数跳转详解 实现的效果:有两款应用A与B,A打开B A --> B 1. 新建工程B,bundle ID为com.YouXianMing.B 建立一个URL 这么 ...
- (转)使用LVS实现负载均衡原理及安装配置详解
使用LVS实现负载均衡原理及安装配置详解 原文:https://www.cnblogs.com/liwei0526vip/p/6370103.html
随机推荐
- JVM内存结构详解
从java编程语言说起... 1. Java编程语言简介 1.1 编程语言概述 系统级和应用级 系统级:C,C++,go,erlang 应用级:C#,Java,Python,Perl,Ruby,php ...
- uiautomatorviewer 截取手机屏幕报错
1. 解决办法: 1.在e盘新建一个文件夹,命名为app.uix 2.打开cmd命令,输入命令adb pull /sdcard/app.uix E:/app.uix 3.打开uiautomatorvi ...
- 附016.Kubernetes_v1.17.4高可用部署
一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...
- SpringBoot 构建 Docker 镜像的 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
- Springboot基于assembly的服务化打包
(1)首先我们编辑 assembly.xml 配置文件,在前文的基础上新增第三方依赖设置(高亮部分),实现将第三方的 jar 包添加到压缩包里的 lib 目录: <?xml version=&q ...
- v-on事件修饰符
.stop阻止冒泡 .prevent阻止默认行为 .capture实现捕获触发事件的机制(从大到小) .self实现只有点击当前元素时,才能出发事件处理函数 .once只触发一次事件函数 .stop和 ...
- Linux系统结构详解(转)
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...
- SpringMVC 学习笔记(六)拦截器
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- xdebug调试代码常用操作
xdebug调试代码常用操作 1.查看变量中的值 2.常用快捷键 ①F8单步调试 ②F9可以直接快速结束调试 ③F7 可以进入调试代码的底层方法,我觉得查看底层代码时,这个特别的方便!
- tap4fun(成都尼必鲁)--2020春招实习
笔试 可能是我做过最简单的笔试了,只有选择填空,而且难度都不是很大,没啥印象了,考点和其他公司的笔试都差不多. 一面(技术面) 具体的不太记得了,因为这是我很后面面的了,所以问题基本都是那几个问题,都 ...
