内容提要

本章的目的是对.Net 框架的设计做一个总体的介绍,包括介绍框架中使用的一些技术、定义一些术语。同时会展示从源代码生成应用程序(或者一些包含了一些自定义类型的可以发布的组件),并且会解释程序的运行机制。

包含以下子标题:

  1. 将源代码编译成托管的模块(Managed Modules)
  2. 将Managed Modules 组合成 Assemblie
  3. 加载 CLR
  4. 执行 Assembly 代码
  5. Native code 生成工具:NGen.exe
  6. .NET 框架类库 (Framework Class Library, FCL)
  7. The Common Type System (CTS)
  8. The Common Language Specification (CTS)
  9. 与非托管代码的互操作性

将源代码编译成托管模块(Managed Modules)

CLR是可以被不同的编程语言共同使用的运行时环境。实际上,在运行时,CLR并不知道程序是使用什么语言写的,因为这些语言都被预先编译成了Managed Module (IL 和 元数据)。不同语言的编译器,可以认为是不同的代码检查器,检查代码的语法是否正确,描述的操作是否合理等。

本地代码产生针对CPU的代码,而C#、F#等语言产生的是针对CLR的代码。

除了产生IL代码之外,所有针对CLR的编译器还会在每个托管模块中生成"元数据"(metadata)。简要来说,Metadata是用来描述module中定义了什么东西(例如类型以及类型的成员)的一组数据表。另外,Metadata还描述了Module中引用了哪些东西(比如外部载入的类型以及类型的成员)

PE32 or PE32+ header

  • 如果模块中含有native code,则会有 PE32(+) 信息,否则(即只包含托管代码)这部分会被忽略掉
  • PE32 for 32bit windows ,while PE32+ for 64bit
  • indicates the type of file : GUI/CUI/DLL
  • contains a time stamp indicating when the file was built

CLR header

  • 包含使得该托管模块所以为托管模块的信息
  • 指定所需要的CLR 的版本、一些flags
  • the MethodDef metadata token of the managed module's entry point method
  • 模块中元数据、资源、strong name 、some flags 等的位置和大小

元数据(Metadata)

  • 所有托管模块都包含元数据表,共分两类:
  • 描述代码中定义的类型和成员的表
  • 源代码中引用了的类型和成员的表

IL代码

  • 源代码编译之后生成的代码
  • CLR负责在运行时将其编译成本地cpu指令

 

Metadata有很多用途,例如:

  • 有了Metadata就不需要像C/C++头文件以及库文件的东西了,因为Metadata将引用模块所需要的信息存储在模块自身当中了,编译器可以从模块中之间提取这部分信息;
  • Visual Studio中的智能输入提示也是通过处理Metadata中所包含的信息来帮助写代码的;
  • CLR的代码验证过程使用Metadata来确保只进行了类型安全的操作;
  • 实现序列化
  • 是的垃圾回收器可以确定对象的生命周期,对任意对象,gc可以通过metadata知道这个对象的类型以及这个对象引用了哪些其他对象;

C#/F#/ILAsm 都是产生托管的代码和托管的类型。而Microsoft C++则默认产生native code,但是可以通过/clr 使其产生托管的module。Microsoft C++还是唯一一个可以允许开发这既使用托管代码又使用非托管代码并且将二者注入到同一个module中的编译器,所以常被利用来在托管项目中调用已有的非托管代码。

 

将Managed Modules 组合成 Assemblie

 

加载 CLR

执行 Assembly 代码

Native code 生成工具:NGen.exe

.NET 框架类库 (Framework Class Library, FCL)

The Common Type System (CTS)

The Common Language Specification (CTS)

与非托管代码的互操作性

【读书笔记】【CLR via C#】【第一章】The CLR’s Execution Model的更多相关文章

  1. [读书笔记]算法(Sedgewick著)·第一章(1)

    到家放松放松之后就开始学习算法了,手里拿的是拿的是一本Robert Sedgewick的橙皮书<算法(第四版)>的.这本书与导论那本书的不同之处在于轻数学思想.重实现,也就是说这是一本很不 ...

  2. 读书笔记 - javascript 高级程序设计 - 第一章 简介

      第一章 简介   诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262  一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...

  3. [读书笔记]算法(Sedgewick著)·第一章(2)

    接着上一篇,mindmap更新如下内容. 3.背包.队列和栈 这节主要讲述了这三种数据结构(Bag.Queue.Stack)的API.实现以及链表.Queue和Stack还含有删除元素的方法.并引出了 ...

  4. 《深入浅出设计模式》读书笔记 C#版(第一章)

    原始需求和设计 事情是这样开始的,公司需要做一套程序,鸭子,设计如下: 一个鸭子父类,多个派生类,三个可override的方法. 第一次需求变更 我们要会飞的鸭子!!!!! 所以我们做了如下的更改: ...

  5. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  6. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  7. The Art of Multiprocessor Programming读书笔记 (更新至第3章)

    这份笔记是我2013年下半年以来读“The Art of Multiprocessor Programming”这本书的读书笔记.目前有关共享内存并发同步相关的书籍并不多,但是学术文献却不少,跨越的时 ...

  8. C++ Primer读书笔记(一)第一篇:C++概述,第一章:开始

    1. 主要内容 介绍程序语言的核心思想和C++的基本概念. 印象比较深刻的就是分而治之(divide and conque)的分解思想. 2. 知识广场 1) C++ 文件后缀 cc, cpp,,cx ...

  9. 嵌入式学习笔记(综合提高篇 第一章) -- 利用串口点亮/关闭LED灯

    1      前言 从踏入嵌入式行业到现在已经过去了4年多,参与开发过的产品不少,有交换机.光端机以及光纤收发器,停车场出入缴费系统,二维码扫码枪,智能指纹锁以及数字IC芯片开发等; 涉及产品中中既有 ...

  10. [读书笔记]算法(Sedgewick著)·第二章.初级排序算法

    本章开始学习排序算法 1.初级排序算法 先从选择排序和插入排序这两个简单的算法开始学习排序算法.选择排序就是依次找到当前数组中最小的元素,将其和第一个元素交换位置,直到整个数组有序. public s ...

随机推荐

  1. Android 在广播接收器中弹出对话框

    特别需要注意的几点如下: 需要设置AlertDialog的类型 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 2. 需要声明Window弹框的权限 < ...

  2. 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证

    /* 1.是否以某字符串结尾 endsWith(theStr,endStr) @param theStr:要判断的字符串 @param endStr:以此字符串结尾 @return boolean; ...

  3. asp.net中利用session对象传递、共享数据[session用法]

    下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...

  4. UVa 872 - Ordering 输出全拓扑排序

    本题要求输出所有拓扑排序的序列. 还好本题的数据量不是非常大.限制在26个大写英文字母,故此能够使用递归法输出. 这个递归输出所有解在Leetcode非常多这种题目的,不小心的话,还是非常难调试的. ...

  5. sqlServer将多字段设为主键方法

    补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...

  6. mysql触发器的作用及语法

    触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...

  7. Flume NG中的Netcat Source

    NetCat是一个非常简单的Unix工具,可以读.写TCP或UDP网络连接(network connection)中数据 在Flume中的netcat支持Flume与NetCat整合,flume可以使 ...

  8. iOS 应用性能测试的相关方法、工具及技巧

    用户不喜欢等待.他们不关心也不应该关心一个应用初始化的时候需要什么,他们只想尽快地完成他们的任务.你的应用应该几乎是瞬间启动的,其界面应当如丝般顺滑.在充满竞争的软件市场中,应用的性能是关键的优势之一 ...

  9. thinkphp3.2.x版本中图片上传缩略图的解决方案

    调用方式很简单 get_sc($cover_id,[$width=180,$height=auto,$cut]) @param $cover_id 图片ID___ @param $width 宽度__ ...

  10. ssh 无密码登录远程服务器

    在讲下文之前,我都默许大家都已经生成了自己的ssh公钥和密钥,在自己的~/.ssh 目录下面,如果没有,请使用 ssh-keygen -t rsa -C "你的邮箱" 命令生成 1 ...