[《.net框架程序设计》]第一章 Microsoft .NET框架开发平台体系结构

原创 2004年06月30日 12:48:00

第一章?? Microsoft .NET框架开发平台体系结构<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一、???????????? 将源代码编译为托管模块:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />?

1、? CLR的存在是得我们可以选择适合表达逻辑的语言,只要存在相应得编译器将代码编译成为面向CLR的代码即可,结果成为托管模块。

?

2、? 托管模块(managed module):是一个需要CLR才能执行的标准windows可移植可执行文件(portable executablePE),组成:

1)??????? PE表头:指出文件类型,文件的时间标记

2)??????? CLR表头:CLR版本,托管模块入口、元数据、资源、强命名、标记等信息

3)??????? 元数据:源代码中定义、引用的类型和成员

4)??????? 中间语言(IL)代码

关于元数据:

l???????? 总与IL代码同步

l???????? 省去源代码编译时对头文件和库文件的需求

l???????? Visual Studio .NET利用之进行智能感知,辅助编码

l???????? 用于CLR的代码验证

l???????? 序列化及反序列化对象

l???????? 垃圾收集器可以追踪对象的生存期

?

二、???????????? 将托管模块组合为程序集

关于程序集的理解:暂歇

三、加载通用语言运行时

1、? 通过在%window%/system32目录下查找MSCorEE.dll文件来判断一个机器中是否安装了.NET框架;而框架的版本可从注册表下的子键:

HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / .NETFramework / policy中查看

2当生成一个EXE程序集时,编译器/链接器会产生一些特殊的信息,并将它们嵌入到结果程序集的PE文件表头及其各个组成文件的.text部分。当EXE文件被调用时,这些特殊的信息将导致CLR被加载并初始化。CLR随后会定位至应胜程序的入口点方法,从面以此来启动应用程序。

?

类似地,如果是一个非托管应用程序通过调用LoadLibrary来加载一个托管程序集,那么该托管程序集DLL的入口点函数也会知道去加载CLR来处理包含在其中的代码

3、? 其他诸如EXE程序集或DLL程序集如何被执行的过程,可在考察普通Windows PE文件的执行过程后进行比较以明确执行过程

四、执行程序集代码

1、? IL代码:一种面向对象的机器语言。可以理解对象类型,包含高级指令:创建和初始化对象、调用对象上的虚方法、直接操作数组元素、抛出和捕获异常;

IL汇编语言能获取CLR的所有功能,其他高级语言智能获取其中的一个子集;

IL代码独立于CPU平台,执行时要先被即时编译器(Just In Time Compiler)编译;

微软提供的IL汇编器:ILAsm.exe 反汇编器:ILDasm.exe

?

2、? IL代码执行过程:

以下面代码段为例:

??????? static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()

??????? {

?????????????? Console.WriteLine(“Hello”);

?????????????? Console.WriteLine(“GoolBye”);

}

?0)代码被执行之前:

???? CLR首先检测Main中代码所引用到的所有类型,并分配一个数据结构记录该类型,数据结构为类型的每个方法分配一个对应条目,记录该方法实现代码的地址;初始化该结构时,各方法被设置为CLR内部的一个函数(未定义的函数)

1)??????? 第一次被执行时

当上述结构中某函数被调用时,JITComplier由该函数的类型及地址信息在程序集的元数据中找到其IL代码的位置,把这些IL代码验证并编译成本地CPU指令这些CPU指令被保存在一个动态分配的内存中,而a)步骤中数据结构中被调用方法的地址则被替换为包含本地CPU指令的地址。

2)??????? 第二次被执行时

若被调用的函数已经被验证并编译过,则直接从内存中调用之

若没有被调用则重复第一次被执行时的情况

3、? 性能

托管代码可能比非托管代码效率更好的理由:

l???????? JIT编译器可检测到新型CPU并产生为这些CPU提供的特殊指令,以优化执行效率

l???????? JIT编译器可检测到总是返回错误的布尔测试,对于其所办函的代码段不产生CPU指令,以使得代码量更小,执行效率更高。

l???????? CLR在运行时有针对性地重新编译某些IL代码,重新组织以提高分支预测的成功率。

4、? NGen.exe提供折中方案,为IL代码提供预编译版本,以避免运行时编译。

5、? IL代码验证:

--被验证为“不安全”的代码将抛出System.Security.VerificationException异常

--代码验证使得可以在一个windows进程中可以运行多个 托管应用程序

更多的讨论在20

五、.NET框架类库(FCL)

CLRFCL允许开发人员创建以下几种应用程序:

l???????? XML Web服务

l???????? Web窗体

l???????? Windows窗体

l???????? Windows控制台应用程序

l???????? Window服务

l???????? 组件库

制作特定的应用程序,关键是对相应得FCL的熟悉,那么首先对.NET Framework熟悉了吧。

六、通用类型系统(Common Type System

描述了CLR中类型的规范

类型的成员组成:

l???????? 字段:表明对象的状态

l???????? 方法:用来改变状态

l???????? 属性:提供对状态访问时输入参数验证、状态有效性检验及必要的求值运算等功能

l???????? 事件:对象间的通知机制

类型可见性和访问类型成员的一些规则:

l???????? Private:只能被同一类型中的代码访问

l???????? Family:可以被派生类中的代码调用,而不管是否位于同一个程序集中

l???????? FamilyAssembly:只能被位于同一个程序集中的派生类代码调用

l???????? Assembly:只能被同一个程序集中的代码调用

l???????? FamilyAssembly:能被任何程序集中的派生类代码调用,也可以被同一程序集中的任何类型调用

l???????? Public:可被任何程序集中的任何代码调用

七、通用语言规范(Common Language Specification

为使一种语言创建的类型能被其他语言无缝访问,微软定义了通用语言规范(CLS)。CLR/CTS支持的特性比CLS定义的丰富得多,实际上不同的语言实现了CLR/CTS特性的一个子集,而CLS则是所有语言特性的交集(一个最小特性集合)。

因此只有遵循CLS的类型才能被其他语言访问、应用,C#中使用:

[assembly:CLSCompliant(true)]

迫使编译器确保在公共导出类型中,剔除不符合CLS的部分。

八、与非托管代码互操作

为避免重新实现所有现有代码,CLR被设计成包含托管部分和非托管部分,CLR支持三种互操作情形:

l???????? 托管代码调用DLL中的非托管函数

l???????? 托管代码使用现存的COM组件

l???????? 非托管代码使用托管类型

?

.NET框架程序设计——体系结构

谈到.NET,相信对于大多数初学者而言,都会感觉比较乱、比较迷茫,什么ASP.NET、VB.NET、VC.NET、ADO.NET、.NETFramework 等等概念,搞的我们晕头转向的,他们之间到底...
  • dongyue786
  • dongyue786
  • 2014年10月15日 15:47
  • 1932

.NET知识体系结构

原文地址: http://www.xcode.me/book/net-framework-maps 最近对.NET框架方面的知识进行了概要的总结,整理了一些知识体系结构图,通过一张图,清晰认识.N...
  • XuWei_XuWei
  • XuWei_XuWei
  • 2014年12月23日 19:43
  • 1982

.Net平台下的B/S开发框架

L.Qiu 博客园首页博问闪存新随笔联系订阅管理 随笔- 29  文章- 0  评论- 112  .Net平台下的B/S开发框架 一、前言   本文主要是对.Net平台...
  • decajes
  • decajes
  • 2013年09月22日 22:37
  • 11326

基于.NET平台常用的框架整理

分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架。 Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度。 Redis...
  • usoa
  • usoa
  • 2016年05月27日 00:40
  • 2753

RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

RDIFramework.NET工作流程组件是以RDIFramework.NET框架为支撑,根据我们多年的项目经验和项目实践,结合国内各大工作流产品的特点研发的一套流程管理组件。该组件不仅考虑到从零搭...
  • chinahuyong
  • chinahuyong
  • 2015年01月19日 09:11
  • 11473

Microsoft.NET 企业级应用 架构设计 (上)

Microsoft.NET 企业级应用 架构设计 (上)1.今天的架构师和架构 在软件里,架构这个术语恰到好处地指代为客户构建系统。 系统存在于环境之中,而环境则通过驱动一系列开发和运维的决策来影响系...
  • u013553804
  • u013553804
  • 2017年12月18日 22:56
  • 89

RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件WinForm业务平台

RDIFramework.NET━工作流组件主要涵盖工作流的设计与定义、流程实例的发起与运行、业务流程的监控与管理、工作流组件与业务系统的集成与协作等内容。WinForm业务协同平台是流程系统与用户交...
  • chinahuyong
  • chinahuyong
  • 2015年01月21日 09:10
  • 3498

(一).NET 框架开发平台体系结构(笔记)

要想深入研究一门言语,必须先了解其体系架构。回顾这些年只重视.NET应用,而忽视了平台的研究,现在回过头来再看.NET框架开发设计,感慨颇多。俗话说好记性不如烂笔头,借助博客来总结一些.NET框架开发...
  • compprogram
  • compprogram
  • 2014年03月03日 17:12
  • 380

如何搭建NET开发项目的框架——ABP框架

前两天我在写一个博客的教程,使用土耳其大牛的ABP框架(ASP.NET Boilerplate),这个框架在中国还不是很火热,我算是走在了前端吧~。那么这个框架如何搭建一个运营类的平台呢?首先我们要归...
  • hb12417058
  • hb12417058
  • 2016年12月21日 15:14
  • 1408

.NET平台常用的框架整理

从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继...
  • moonpure
  • moonpure
  • 2016年07月28日 15:57
  • 8802
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[《.net框架程序设计》]第一章 Microsoft .NET框架开发平台体系结构
举报原因:
原因补充:

(最多只允许输入30个字)