Presentation is loading. Please wait.

Presentation is loading. Please wait.

基于 C# 的 .NET Framework 程序设计

Similar presentations


Presentation on theme: "基于 C# 的 .NET Framework 程序设计"— Presentation transcript:

1 基于 C# 的 .NET Framework 程序设计
第10章 数据流和文件 第11章 Internet访问 第12章 序列化 第13章 远程处理和XML Web Service 第14章 线程和异步编程 第15章 托管代码与非托管代 码之间的互操作 第16章 使用Microsoft ADO.NET 访问数据 第17章 属性 第1章 Microsoft .NET Framework概述 第2章 托管执行环境的介绍 第3章 使用组件 第4章 部署与版本控制 第5章 通用类型系统 第6章 类型的使用 第7章 字符串、数组和集合 第8章 委托和事件 第9章 内存和资源管理 目的: 使学生能够使用C#编写一个简单的控制台程序; 使学生能够了解托管执行环境中代码是怎样被编译和执行的; 使学生初步掌握.NET技术的相关重要概念; 重点: 本章重点介如何创建一个.NET应用程序及涉及到的重要概念; 应用程序在托管环境下的编译和执行过程; 难点: 本章.NET的重要概念非常多,也比较难理解,需要仔细讲解; 难理解的概念包括: 命名空间 应用程序域 元数据及作用 公共语言运行库环境 (CLR) 程序集 注意: 本章的推荐教学课时为2课时; 加下划线为即将学到的内容。

2 第2章 托管执行环境介绍 编写 .NET 应用程序 编译和运行 .NET 应用程序 注意: 加下划线为即将学到的内容。

3 编写 .NET 应用程序 使用命名空间 定义命名空间和类 入口点、作用范围和声明 控制台输入和输出 区分大小写
重点: 用记事本创建一个简单的“Hello World”应用程序; 重点介绍该应用程序的结构和包含的各个重要组成部分; 控制台输入输出方法; 难点: 如何解释清楚应用程序涉及到的重要概念和技术术语,如命名空间、入口点和作用范围等; 应用程序入口点的概念; 注意: 使用记事本编写源代码文件,不要用Visual Studio.NET,这样可以让学生更好地了解程序整个编译和执行过程; 参考: 介绍一下“Hello World”程序的历史由来,以活跃课堂气氛。 以“Hello World”程序作为一本编程书籍的开始,已经成为历史悠久的传统。一般认为这一传统来自C语言之父Kernighan所著《The C Programming Language》(1988)一书,该书的第一个程序就是“Hello World”程序,它代表一种新的编程语言的问世。

4 使用命名空间 类可以全路径引用 或者引用命名空间 // 声明 FileStream 对象 不需要全部限定包含该类的名称
使用命名空间 类可以全路径引用 或者引用命名空间 不需要全部限定包含该类的名称 // 声明 FileStream 对象 System.IO.FileStream aFileStream; 重点: 全路径引用; 引用命名空间的方式; .NET Framework中包含的重要的命名空间,System、System.text、System.Data、System.IO…等; 难点: 解释命名空间的作用:命名空间是.NET组织类的一种方式,可以避免类名冲突; 课堂提问: .NET Framework的根命名空间是什么? System; 参考: 全路径引用: 全路径引用是以定义对象的命名空间的名称为前缀的对象引用。如果创建对该类的引用(如在Visual Studio.NET IDE中选择“项目”菜单中的“添加引用”),然后在代码中使用对象的完全限定名,就可以使用在其他项目中定义的对象。下面的代码片段说明如何以全路径引用来使用另一项目命名空间中的类: ListBoxProject.Form1.ListBox LBC = new ListBoxProject.Form1.ListBox() ; using System.IO; ... FileStream aFileStream;

5 定义命名空间和类 C# 支持自定义命名空间和在这些命名空间下的类 所有的类都要定义在某个命名空间下
定义命名空间和类 C# 支持自定义命名空间和在这些命名空间下的类 所有的类都要定义在某个命名空间下 如果没有明确提供命名空间,类就添加到一个没有 名称的全局命名空间中 命名空间可以嵌套 namespace CompCS { public class StringComponent { } 重点: 如何自定义命名空间; 如何在命名空间下添加类; 参考: Microsoft建议在自定义命名空间时至少要两个嵌套的命名空间名,第一个是公司名,第二个是技术名称。这样可以防止和其他组织的类名冲突。

6 入口点、作用范围和声明 在 C# 中,应用程序入口点是一个类的公有的 main() 函数 入口点函数可以带string数组类型的参数
入口点、作用范围和声明 在 C# 中,应用程序入口点是一个类的公有的 main() 函数 入口点函数可以带string数组类型的参数 class MainApp { public static void Main() {. . .} } class MainApp { public static void Main(string[] agrs) { if(agrs.Length>0) } } 重点: 入口点函数的作用; 变量使用时要注意的地方,如变量使用前要声明,声明后最好马上初始化; 难点: 解释清楚:入口点是类中pubic的静态main()函数,一般情况下没有返回值; 课堂讨论: 讨论见过的几种其他类型应用程序的入口点函数。 c/c++的main(),win32下WinMain()函数,java的static main()函数。

7 入口点、作用范围和声明(续) C# 支持以点号作为范围解析符 在 C# 中,在用一个变量之前一定先声明它
入口点、作用范围和声明 C# 支持以点号作为范围解析符 在 C# 中,在用一个变量之前一定先声明它 Console.WriteLine ("First String"); Lib.Comp myComp = new Lib.Comp(); 重点: 强调在使用变量前一定要先声明变量。

8 控制台输入和输出 控制台输入方法 控制台输出方法 Read,ReadLine()
控制台输入和输出 控制台输入方法 Read,ReadLine() 控制台输出方法 Write,WriteLine() String s = Console.ReadLine(); 重点: 介绍控制台的两种输入方法; 介绍控制台的两种输出方法; 课堂提问: 用什么类和方法进行控制台的输入和输出? Console类的WriteLine()和ReadLine()方法; 参考: Console可以用Read()一个字符一个字符读取输入流,也可用ReadLine()读取一行; Console的WriteLine()方法象C的printf(),可以格式化输出; 同时WriteLine()方法提供各种形式的重载,输出变量之前不必转换成string。 Console.WriteLine(“Hello World”);

9 区分大小写 不要用需要区分大小写的名字 应避免下列用法 保证区分大小写和不区分大小写的语言都可充分调用组 件
区分大小写 不要用需要区分大小写的名字 保证区分大小写和不区分大小写的语言都可充分调用组 件 在单一名称范围,不要用大小写来区分标识符 应避免下列用法 class customer {...} class Customer {...} void foo(int X, int x) 重点: 强调在单一名称范围,不要用大小写来区分标识符。

10 第2章 托管执行环境介绍 编写 .NET 应用程序 编译和运行 .NET 应用程序 注意: 加下划线为即将学到的内容。

11 编译和运行.NET Framework应用程序
公共语言运行库工 具 实时(JIT, Just-In-Time) 编译 应用程序域 垃圾回收 编译器选项 托管执行的过程 元数据 Microsoft 中间语言 (MSIL) 程序集 重点: 详细介绍编译器及编译选项; 编译结果、程序集及其组成部分(元数据,清单….); 什么是Microsoft中间语言; 什么是应用程序域,有什么作用; 实时编译的概念及其作用; .NET应用程序和执行环境中的重要概念和程序编译执行过程; 如何运用.NET反编译工具查看.NET应用程序集中的信息; 难点: .NET应用程序的编译执行过程,代码在.NET托管执行引擎中各步骤所发生的变化; .NET托管执行引擎各组件的作用(类加载器, JIT编译器, 垃圾回收器….); 元数据在整个应用程序执行过程中所起的重要作用。

12 编译器选项 直接从命令行窗口中编译 用 /target 或 /t 指定编译目标 用 /reference 或 /r 来引用程序集
编译器选项 直接从命令行窗口中编译 用 /target 或 /t 指定编译目标 用 /reference 或 /r 来引用程序集 >csc HelloDemoCS.cs csc /t:exe HelloDemoCS.cs 重点: 编译器的作用; C#编译器的各个选项开关及其含义,包括: /t:代表什么; /out:代表什么; /r:代表什么; 参考: 编译不同类型的工程: /t:exe 控制台应用; /t:winexe Windows Form应用; /t:library 包含清单的程序集; /t:module 不包含清单独立程序集; 注意: 编译器选项很多,使用也比较复杂,有兴趣的可以查看.NET Framework文档,也可以用csc /? 来查看整个命令参数清单。 >csc /t:exe /r:assemb1.dll HelloDemoVB.vb

13 托管执行的过程 运行时引擎 2.2.2 托管执行的过程 编译器 类装载器 JIT 编译器 可信任的 预编译 JIT代码 调用 未编译 方法
托管执行的过程 EXE/DLL (MSIL 和元数据) 源代码 编译器 类库 (MSIL 和元数据 ) 类装载器 JIT 编译器 可信任的 预编译 JIT代码 托管 本地 代码 调用 未编译 方法 重点: 介绍在托管环境下的编译和执行.NET应用程序的基本概念; 认识一些新的技术术语; 难点: .NET应用程序在托管环境下编译和执行过程; 运行时引擎都提供了哪些服务,各组件都提供了什么作用; 课堂提问: 哪个组件把MSIL编译成本地代码? 实时编译器 just-in-time (JIT) compiler。 执行 安全检查 运行时引擎

14 元数据 元数据是在编译时嵌入的声明性信息 包括所有 .NET Framework文件和资源文件 如文本(txt、xml)、声音图像等资源文件
元数据 元数据是在编译时嵌入的声明性信息 应用程序版本、区域、公钥信息 类型成员(方法、字段、属性、事件、嵌套的类型) 安全许可证信息 该程序集所依赖的其他程序集 包括所有 .NET Framework文件和资源文件 如文本(txt、xml)、声音图像等资源文件 重点: 元数据的概念; 元数据保存的信息(版本、类型、安全许可、类型定义、方法等….); 注意: 元数据在.NET中占有非常重要的地位,它使程序集具有自描述功能,代替了过去的接口定义语言(IDL),同时通过属性(Attribute)可以扩展元数据; 参考: 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件(PE)或存储在内存中的程序进行描述; 代码编译为PE文件时,便会将元数据插入到该文件的一部分中; 在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明; 当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息; 接口定义语言(IDL): 接口定义语言(IDL)是一种标准的语言,为分布式或者基于组件的应用程序定义函数和方法的接口。它在像COBRA和COM这样的技术中使用得很多。在大多数情况下,使用IDL对于你来说是透明的;它通常被集成到你工作要用到的工具和开发平台里了。(如果你精通任何类似C语言家族的语言,包括Java、C++和C#等,那么IDL非常类似于C语言的句法对你来说会是很熟悉的。)

15 元数据(续) 元数据的作用 加载和定位类 增强代码安全性 解析方法调用 提供反射支持 可利用特性扩展元数据 2.2.3 元数据 参考:
元数据 元数据的作用 加载和定位类 增强代码安全性 解析方法调用 提供反射支持 可利用特性扩展元数据 参考: 更多内容参考.NET FrameworkSDK文档中的“元数据”。

16 Microsoft 中间语言(MSIL) 可被任何支持中间语言的编译器产生 可被公共语言运行库JIT编译器转变成本地代码
任何兼容公共类型系统(CTS)的编译器(如:cobol、perl、 pascal、smarttalk…)都可以产生中间语言代码 可被公共语言运行库JIT编译器转变成本地代码 在可以执行代码前,必须将 MSIL 转换为 CPU 特定的本地代 码,这通常是通过实时(JIT)编译完成的 重点: 中间语言的概念; 中间语言是如何产生的; 中间语言如何转换成本地可执行代码; 课堂提问: .NET编译器生成的代码叫什么? Microsoft中间语言,或者托管代码; 参考: 编译器将源代码翻译为Microsoft中间语言 (MSIL),这是一组可以有效地转换为本机代码且独立于CPU的指令; MSIL包括用于加载、存储和初始化对象以及对对象调用方法的指令。

17 程序集 多个托管模块 和资源文件被 编译到一个程 序集 2.2.5 程序集 程序集 .html .gif 资源文件 托管模块
程序集 托管模块 (MSIL 和元数据) 托管模块 (MSIL 和元数据) 程序集 清单 .html .gif 多个托管模块 和资源文件被 编译到一个程 序集 重点: 程序集的概念; 程序集是如何产生的及其组成部分; 程序集中清单的概念及其保存的信息; 参考: 程序集是.NET Framework应用程序的生成块; 程序集构成了部署、版本控制、重复使用和安全权限的基本单元; 程序集是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻辑功能单元; 通常,静态程序集可能由以下四个元素组成: 清单(manifest) 类型元数据 Microsoft 中间语言 (MSIL) 代码 资源集 其中只有程序集清单是必需的。 资源文件

18 公共语言运行库工具 和MSIL一起工作的运行时实用工具 MSIL 编译器 (ilasm.exe)
公共语言运行库工具 和MSIL一起工作的运行时实用工具 MSIL 编译器 (ilasm.exe) 从Microsoft中间语言 (MSIL) 生成最终可执行二进制代码。 MSIL 反编译器 (ildasm.exe) 检查元数据和托管二进制代码,利用包含 MSI 代码的 PE 文件,创建适合输入到 MSI 汇编程序 (Ilasm.exe) 的文本文 件。 强名称工具 (sn.exe) 帮助创建带强名称的程序集。sn.exe 提供用于密钥管理、 签名生成和签名验证的选项。 参考: Microsoft .NET Framework SDK包含了很多实用工具: 资源文件生成器 (Resgen.exe) 强名称工具 (Sn.exe) 类型库导出程序 (Tlbexp.exe) 类型库导入程序 (Tlbimp.exe) 全局程序集缓存工具 (Gacutil.exe) 程序集注册工具 (Regasm.exe) …… 这里只列出一部分,更多内容可以参看.NET Framework文档。

19 实时(JIT, Just-In-Time)编译
JIT 编译器提供针对特定 CPU 的优化 由于公共语言运行库为每种受支持的CPU结构都提供了 JIT编译器,开发人员可以编写一组可在不同结构的计算机上 进行JIT编译和执行的MSIL 。 代码执行过程 MSIL 按需生成本地代码 为后面的调用保存已编译的本地代码 注意: JIT编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是花时间和内存将可移植可执行 (PE) 文件中的所有MSIL 转换为本机代码,而是在执行期间根据需要转换MSIL,并存储本机代码供后面的调用使用。

20 应用程序域 过去进程边界用来隔离应用程序 在 CLR 中, 应用程序域提供应用程序之间的隔离 在一个应用程序中的错误不会影响其他的应用程 序
应用程序域 过去进程边界用来隔离应用程序 在 CLR 中, 应用程序域提供应用程序之间的隔离 以极小的性能损失进行代码类型安全检查来隔离应用程 序 多个应用程序域可并存于同一个应用程序中 能够在不停止整个进程的情况下停止单个应用程序 在一个应用程序中运行的代码不能直接访问其他应用程 序中的代码或资源 在一个应用程序中的错误不会影响其他的应用程 序 重点: 应用程序域的概念; 应用程序域和过去的进程的比较; 应用程序域的作用和优点; 参考: 应用程序域所提供的隔离具有以下优点: 因为安全类型的代码不会导致内存错误,所以应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序; 能够在不停止整个进程的情况下停止单个应用程序; 在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源; 代码行为的作用范围由它运行所在的应用程序决定; 向代码授予的权限可以由代码运行所在的应用程序域来控制。

21 多媒体演示 应用程序加载和单文件程序集执行
多媒体演示 应用程序加载和单文件程序集执行 注意: 通过动画演示讲解程序集代码是怎样被执行的。

22 垃圾回收 垃圾回收 垃圾回收在.NET Framework中自动进行对象内存管 理 垃圾回收优化引擎根据正在进行的分配情况确定执行回收的 最佳时间。当垃圾回收执行回收过程时,它检查托管堆中不 再被应用程序使用的对象来回收它们占用的内存。 不再需要手动进行对象内存的跟踪和管理 对象内存的跟踪和销毁都通过垃圾回收引擎来适当地自动进 行 重点: 垃圾回收在.NET内存管理中的作用; 注意: 垃圾回收的过程和算法比较复杂,不要求全部掌握,有兴趣的可以参考MSDN技术社区的文章; 参考: 强制垃圾回收; 垃圾回收GC类提供GC.Collect方法,你可以使用该方法让应用程序在一定程度上直接控制垃圾回收; 通常情况下,你应该避免调用任何回收方法,让垃圾回收独立运行。在大多数情况下,垃圾回收在确定执行回收的最佳时机方面更有优势。

23 回顾 学习完本章后,将能够: 编写 .NET 应用程序 编译和运行 .NET 应用程序 重点: 命名空间、入口点;
程序集、元数据、实时编译、垃圾回收、应用程序域和中间语言; 应用程序的编译和执行过程。

24 实验 生成一个简单的.NET应用程序 练习 1 用C#创建程序 练习 2 使用MSIL反汇编程序 15分钟 重点:


Download ppt "基于 C# 的 .NET Framework 程序设计"

Similar presentations


Ads by Google