.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数。那么,CLR的执行模型是一个什么样的过程呢?
将源代码编译成托管模块 --> 将托管模块合并成程序集 --> 加载公共语言运行时 --> 执行程序集的代码
目录
- 将源代码编译成托管模块
- 将托管模块合并成程序集
- 加载公共语言运行时
- 执行程序集的代码
- 本地代码生成器:NGen.exe
- Framwork类库入门
- 通用类型系统
- 公共语言规范(CLS)
- 与非托管代码的互操作性
将源代码编译成托管模块
首先.Net开发是支持多语言选择或者混合语言编程的,代码的编译是采用编译器面向CLR的机制,即,无论何种语言编写的代码,只要采用的编译器是面向CLR的就可以了。
Common Language Runtime:公共语言运行时,可由多种编程语言使用的"运行时"。CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。
Managed module:托管模块,即编译器编译的结果都是一个托管模块。
IL:每个面向CLR的编译器生成的都是IL(中间语言)代码。也成为托管代码,因为CLR要管理它的执行。
Native code compiler:本地代码编译器。生成的是面向特定CPU架构(X86、X64、IA64)的代码。
Metadata:元数据。是一种数据表,其中一些数据描述了模块中定义的内容,比如类型和成员;还有些数据描述了模块引用的内容,比如导入的类型及其成员。元数据总是和包含IL代码的文件关联,永远是同步的。
将托管模块合并成程序集
上图显示了托管模块合并成程序集的过程。
程序集(assembly)的理解:一个或者多个模块/资源文件的逻辑性分组;程序集是重用、安全性、版本控制的最小单元。
从上图显示可看出程序集(assembly)包含一个名为"清单"(manifest)的数据块,它是由元数据表构成的另一种集合,描述了构成程序集的文件。
另一个地方就是AL.exe:程序集连接器
加载公共语言运行时
Windows 检查EXE文件头:
PE32:需要32位地址空间,可在32位/64位地址空间中运行
PE32+:需要64位地址空间
CPU架构信息,确保当前CPU是符合要求的
创建32/64/WoW64位进程 :根据exe文件头创建的
加载MSCorEE.dll: 该文件在C:\Windows\SysWow64 或 C:\Windwos\Sys
看上面的流程还是比较清晰的。
执行程序集的代码
为了执行一个方法,首先必须把它的IL转换成本地的CPU指令。这是CLR的JIT(just-in-time或者"即时")编译器的职责。从示意图来分析其过程是如何的。
- Mian()执行之前,CLR先检测出Main的代码所引用的所有类型.
- 分配内部数据结构,用于管理所引用类型的访问,如图Console类型,Console类型定义的每一个方法都有一个对应的entry(记录项)。每个entry都容纳了一个地址,根据此地址即可找到方法的实现.对这个结构进行初始化时,CLR将每个记录项都设置成(指向)包含在CLR内部的一个未文档化的函数,这个函数即为JITCompiler
-
Main函数首次调用WriteLine时,JITCompiler函数会被调用。
JITCompiler 函数调用时,JITCompiler在定义该类型的程序集的元数据中查找被调用方法的IL
-->验证IL
-->编译成本地CPU指令
-->返回到刚才的记录,并修改对JITCompiler的引用,指向刚才编译的内存块的地址
-->JITCompiler函数跳转到刚才的内存块执行
-->返回到Mian继续执行
-
Main函数第二次调用WriteLine时
本地代码生成器:NGen.exe
NGen.exe:.NET Framework 提供的工具,可以在一个应用程序安装到目标计算机上时,将IL代码编译成本地代码。
NGen.exe终于作用:
- 加快应用程序的启动速度
- 减少应用程序的工作集(working Set)
位置:类似C:\Windows\Microsoft.NET\Framework\v4.0.30319
命令语法:
ngen <action> [options]
ngen /? | /help
Framework类库
FCL:Framework Class Library 是一组DLL程序集的统称。
通用类型系统
CTS:Common Type System,它描述了类型的定义和行为。
公共语言规范
CLS:Common Language Specification
相信混合语言的编程才迫使微软制定了CLS。CLS解决的问题是使用不同的语言创建的对象能够相互通信。要创建很容易从其他语言中访问的类型,只能从自己的编程语言中挑选其他语言都确定支持的那些功能。
这就要求任何编译器生成的类型要想兼容于由其他"符合CLS、面向CLR的语言"所生成的组件,就必须支持这个最小功能集。
告诉编译器需要检查CLS兼容性的语法
[assembly:CLSCompliant(true)]
namespace SomeLibrary
{
}
与非托管代码的互操作性
为了迎合之前的非托管代码的用户,微软通过CLR提供了一些机制,允许应用程序中同时包含托管和非托管代码。
- 托管代码能调用DLL中的非托管函数
- 托管代码可使用现有的COM组件(服务器)
- 非托管代码可使用托管类型(服务器)
本文还是主要学习了一些.NET平台设计的一些架构思想和概念,应该在整体上对.NET有一个基本的认识。
01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型的更多相关文章
-
【CUDA 基础】3.1 CUDA执行模型概述
title: [CUDA 基础]3.1 CUDA执行模型概述 categories: CUDA Freshman tags: CUDA SM SIMT SIMD Fermi Kepler toc: t ...
-
[Clr via C#读书笔记]Cp1CLR执行模型
Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...
-
CLR基础之一---认识CLR [《CLR via C#》读书笔记]
<CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称.这 ...
-
由浅入深学习.NET CLR 系列:目录
经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NE ...
-
【Basics of Entity Framework】【EF基础系列1】
EF自己包括看视频,看MSDN零零散散的学了一点皮毛,这次打算系统学习一下EF.我将会使用VS2012来学习这个EF基础系列. 现在看看EF的历史吧: EF版本 相关版本特性介绍 EF3.5 基于数据 ...
-
深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现
在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...
-
大数据学习之Linux基础01
大数据学习之Linux基础 01:Linux简介 linux是一种*和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ...
-
公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记
前言 让拖管代码对象和非托管对象协同工作的过程称为互用性(Interoperability),通常简称为 Interop. P/Invoke在托管代码与非托管代码交互式时产生一个事务(Transiti ...
-
深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了
Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...
随机推荐
-
jsp连接sqlServer数据库教程
一.首先讲下我用的工具版本以供参考: jar包:jtds1.3.1.jar 下载地址:点击进入 数据库:SQL Server2012 服务器:Tomcat8.0 下载地址:点击进入 开发IDE工 ...
-
c#之第三课
学习获取终端输入的参数并且打印,以及使用循环. using System; public class CommandLine { public static void Main(string[] ar ...
-
struts2中struts.xml配置文件详解【未整理】
1. 深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. 1.1. 包配置: Struts2框架中核心组件就是Action.拦截器等,Struts2框架使用包来管 ...
-
实记JLink刷固件方法
最近J-Link调试程序,不知何故,USB报无法连接,试了别的电脑也是这样.文件存于“百度网盘/05.组装维修/4.单片机/1.JLink-ARM仿真器”下.所有的操作基于WIN7 32位系统. 1. ...
-
BS软件注册
关于BS软件注册问题,目前的方式有通过加密狗访问的方式比较安全,本人为了节省使用成本,采用注册码的形式对每个客户端采用注册码的形式进行认证,防止用户使用同一账号在不同地方登陆使用,也可以防止一个账号, ...
-
网络NSURLSession
简单下载图片 dispatch_queue_t queue =dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT); dispatch_asyn ...
-
Pong 打乒乓
发售年份 1972 发售平台 多平台 开发商 雅达利(Atari) 类型 体育休闲 https://www.youtube.com/watch?v=fiShX2pTz9A
-
selenium page object模式
页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...
-
SSH安全
新建用户,设置密码 useradd eason passwd eason 不允许root直接登陆 修改配置文件 vi /etc/ssh/sshd_config 禁止root登录 查找“#PermitR ...
-
ORADEBUG DOC 12.1.0.2
https://berxblog.blogspot.com/2015/01/oradebug-doc-12102.html this is just an online docu of ORAD ...