第一章 .Net体系结构

1,公共语言运行库(Common Language Runtime, CLR)

.Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库。通常在CLR的控制下运行的代码称为托管代码(managed code)。

 

在CLR执行编写好的源代码之前,需要编译它们。在.Net中,编译分为两个阶段:

  • 把源代码编译成Microsoft中间语言(Microsoft Intermediate Language,MSIL)。
  • CLR把IL编译为平台专用的代码

Microsoft中间语言与Java字节代码共享一个理念:它们都是低级语言,语法简单,可以非常快速地转换为内部机器码。

 

IL总是即时编译(JIT)的。JIT编译器并不是把整个应用程序一次编译完,而是只编译它调用的那部分代码。代码编译过一次后,得到的内部可执行代码就会被存储起来,直到退出该应用程序为止,这样在下次执行这部分代码时,就不需要重新编译了。Microsoft认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在每次运行过程中都执行的,使用JIT,从来都不会编译这部分代码。这样做提高性能的原因是编译过程的最后一部分是在运行时执行的,JIT编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器的任何特性或特定的机器代码指令来优化最终的可执行代码。

 

语言的互操作性:IL不仅支持平台无关性,还支持语言的互操作性。简而言之,就是可以将任何一种语言编译成中间代码,编译好的代码可以与从其他语言编译过来的代码进行交互。

包括Visual Basic , Visual C++,COM和COM+。

如VC++:

使用#using <mscorlib.dll>或者定义ref class MyClass{}

 

2,中间语言

中间语言的主要特征:

  • 面向对象和使用接口
  • 值类型和引用类型之间的巨大差别
  • 强数据类型
  • 使用异常来处理错误
  • 使用特性(attribute)

(1)接口:一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式

(2)相异值类型和引用类型:

值类型:直接保存数据,

引用类型:仅保存地址

(3)强数据类型

所有变量都清晰地标记为属于某个特定的类型,不可在不同类型数据之间转换指针。

强数据类型提供了:语言互操作性,垃圾收集、安全性和应用程序域等特性。

 

通过使用通用类型系统(CTS)解决语言互操作中数据类型不同的问题。

公共语言规范(Common Language Specification,CLS)是一个最低标准集,所有面向.Net的编译器都必须支持它。

垃圾收集:

Windows平台已经使用两种技术来释放进程向系统释放动态请求的内存:

  • 完全以手工的方式使应用程序代码完成这些工作
  • 让对象维护引用计数

维护引用计数是COM使用的一种技术,每个COM组件保留一个计数,记录客户机目前对它的引用计数。

.Net运行库使用垃圾收集器,方法是所有动态请求的内存都分配到堆上,当.Net检测到给定进程的托管堆已满时,调用垃圾收集器。垃圾收集器处理目前代码中所有的变量,检查对存储在托管堆上的对象的引用,确定哪些对象可以从代码中访问-即那些对象有引用,没有引用的对象就不能再从代码中访问,因而被删除。

垃圾收集器具有不确定性,不能保证什么时候调用垃圾收集器。.Net运行库决定需要它时,就可以调用它。但可以重写这个过程,在代码中调用垃圾收集器。

 

应用程序域:Windows通过地址空间把进程分隔开来,每个进程有4GB的虚拟内存来存储其数据和可执行代码。Windows利用额外的间接方式把这些虚拟内存映射到物理内存或者硬盘上。

应用程序域是分离组件的一种方式,他不会导致因在进程之间传送数据而产生的性能问题。方法为把任何一个进程分解到多个应用程序域中,每个应用程序域大致对应一个应用程序,执行的每个线程都运行在一个具体的应用程序域中。

 

3,程序集

程序集(assembly)是包含编译好的、面向.Net Framework的代码逻辑单元。

程序集是完全自描述性的,也是一个逻辑单元而不是物理单元。

程序集的一个重要特性就是它们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个称为"程序集清单"的区域中,可以检查程序集的版本及其完整性。

可以使用ildasm检查程序集内容。

 

私有数据集:最简单的程序集类型,一般附带在某一个软件上,并且只能应用于该软件。

共享程序集:其它软件可使用的公共库

存在问题:

  • 名称冲突:另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名。
  • 程序集被同一个程序集的不同版本覆盖-新版本与某些已有的代码不兼容。

解决方法:将共享程序集放在文件系统的一个特定子目录中,称为全局程序集高速缓存(GAC)。与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,而需要专门安装到高速缓存中,这个过程可以使用许多.Net工具来完成,

名称冲突:共享程序集应根据私钥加密算法指定一个名称,称为强名,保证唯一性。

版本:在程序集清单中指定版本信息来解决。

 

反射:编程访问程序集中的元数据

 

4,命名空间

命名空间是.Net避免名称冲突的一种方式。

 

5,使用C#创建.Net应用程序

Asp.Net:用于创建带有动态内容的Web页面

 

WPF(Windows Presentation Foundation)创建GUI程序,使用XAML(extensible application markup language)应用程序标记语言声明UI。

 

Windows服务:在Windows后台连续运行的程序。

 

C#高级编程 (第六版) 学习 第一章:.Net体系结构的更多相关文章

  1. C#高级编程 (第六版) 学习 第二章:C#基础

    第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...

  2. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  3. C#高级编程 (第六版) 学习 第七章:委托和事件

    第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...

  4. C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换

    第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...

  5. C#高级编程(第六版)学习:第三十一章:Windows窗体

    第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...

  6. C#高级编程 (第六版) 学习 第五章:数组

    第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...

  7. C#高级编程 (第六版) 学习 第四章:继承

    第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码.   2,实现继承 class MyDe ...

  8. C#高级编程 (第六版) 学习 第三章:对象和类型

    第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上   2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件   函数成员 方法:与某个类相关的函数,可以 ...

  9. c#高级编程第七版 学习笔记 第一章 .NET体系结构

    第一章      .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...

随机推荐

  1. P2P借款人信用风险实时监控模型设计

    P2P借款人信用风险实时监控模型设计 P2P网络贷款(“peer-to-peer”)为中小企业和个人提供了便利的融资渠道.近年来,随着互联网金融的逐步发展,P2P网贷已成为时下炙手可热的互联网金融新模 ...

  2. 树莓派3B+学习笔记:9、更改软件源

    树莓派系统安装完成后,由于默认软件源服务器访问速度慢,安装软件耗时会很长,可以通过更改软件源来加快软件的安装速度. 系统安装完成后默认软件源如下: 更改镜像源前需要自行查找镜像源,并记下网址: 1.阿 ...

  3. C语言——第一章,程序设计和C语言

    第一章,程序设计和C语言 一,程序和程序语言 程序:完成某项事物所预设的活动方式和活动过程 程序设计:人们描述(指程序)计算机要做的工作 程序设计语言及发展 1,机器语言    2,汇编语言    3 ...

  4. 折腾VIM的C++缩进

    自己是2014年的时候,开始学习VIM编辑器.记得当时把整个VIM入门手册几乎通读了一边,为其强大的功能和便捷的操作所折服. 今天再次捣鼓了以下VIM,只因为用VIM编辑C++的代码时,类中的publ ...

  5. FPGA静态时序分析基础

    FPGA静态时序分析基础 基本概念 Skew: 时钟偏移 Skew表示时钟到达不同触发器的延时差别,Tskew = 时钟到达2号触发器的时刻 - 时钟到达1号触发器的时刻. Jitter: 时钟抖动 ...

  6. 准确率(accuracy),精确率(Precision),召回率(Recall)和综合评价指标(F1-Measure )----转

    原文:http://blog.csdn.net/t710smgtwoshima/article/details/8215037   Recall(召回率);Precision(准确率);F1-Meat ...

  7. Springboot启动报Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered.

    解决方法: 属于bean重复,根据错误提示剔除多于的Bean引用!

  8. 【commons】邮件发送工具——commons-email

    一.概述 直接通过官网的overview进行了解,一句话概括如下: Commons Email aims to provide a API for sending email. It is built ...

  9. 20155231 java实验一 Java开发环境的熟悉

    20155231 java实验一 Java开发环境的熟悉 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 完成实验.撰写实验 ...

  10. java课堂实践(5月17日)20155317 王新玮

    对P145 MathTool.java 代码托管 在IDEA中,使用JUnit进行单元测试,测试用例不少于三个,要包含正常情况,边界情况.提交测试代码和运行结果截图,加上学号水印,提交码云代码链接. ...