240 likes | 471 Views
基于 C# 的 .NET Framework 程序设计. 第 1 章 Microsoft .NET Framework 概述 第 2 章 托管执行环境的介绍 第 3 章 使用组件 第 4 章 部署与版本控制 第 5 章 通用类型系统 第 6 章 类型的使用 第 7 章 字符串、数组和集合 第 8 章 委托和事件 第 9 章 内存和资源管理. 第 10 章 数据流和文件 第 11 章 Internet 访问 第 12 章 序列化 第 13 章 远程处理和 XML Web Service 第 14 章 线程和异步编程
E N D
基于 C# 的 .NET Framework 程序设计 • 第1章 Microsoft .NET Framework概述 • 第2章 托管执行环境的介绍 • 第3章 使用组件 • 第4章 部署与版本控制 • 第5章 通用类型系统 • 第6章 类型的使用 • 第7章 字符串、数组和集合 • 第8章 委托和事件 • 第9章 内存和资源管理 • 第10章 数据流和文件 • 第11章 Internet访问 • 第12章 序列化 • 第13章 远程处理和XML Web Service • 第14章 线程和异步编程 • 第15章 托管代码与非托管代码之间的互操作 • 第16章 使用Microsoft ADO.NET 访问数据 • 第17章 属性
第2章 托管执行环境介绍 • 编写 .NET 应用程序 • 编译和运行 .NET 应用程序
编写 .NET 应用程序 2.1 编写 .NET 应用程序 • 使用命名空间 • 定义命名空间和类 • 入口点、作用范围和声明 • 控制台输入和输出 • 区分大小写
使用命名空间 2.1.1 使用命名空间 • 类可以全路径引用 • 或者引用命名空间 • 不需要全部限定包含该类的名称 // 声明 FileStream 对象 System.IO.FileStream aFileStream; using System.IO; ... FileStream aFileStream;
定义命名空间和类 2.1.2 定义命名空间和类 • C# 支持自定义命名空间和在这些命名空间下的类 • 所有的类都要定义在某个命名空间下 • 如果没有明确提供命名空间,类就添加到一个没有名称的全局命名空间中 • 命名空间可以嵌套 namespace CompCS { public class StringComponent { } }
入口点、作用范围和声明 2.1.3 入口点、作用范围和声明 • 在 C# 中,应用程序入口点是一个类的公有的 main() 函数 • 入口点函数可以带string数组类型的参数 class MainApp { public static void Main() {. . .} } class MainApp { public static void Main(string[] agrs) { if(agrs.Length>0) . . . } }
入口点、作用范围和声明(续) 2.1.3 入口点、作用范围和声明 • C# 支持以点号作为范围解析符 • 在 C# 中,在用一个变量之前一定先声明它 Console.WriteLine ("First String"); Lib.Comp myComp = new Lib.Comp();
控制台输入和输出 2.1.4 控制台输入和输出 • 控制台输入方法 • Read,ReadLine() • 控制台输出方法 • Write,WriteLine() String s = Console.ReadLine(); Console.WriteLine(“Hello World”);
区分大小写 2.1.5 区分大小写 • 不要用需要区分大小写的名字 • 保证区分大小写和不区分大小写的语言都可充分调用组件 • 在单一名称范围,不要用大小写来区分标识符 • 应避免下列用法 class customer {...} class Customer {...} void foo(int X, int x)
第2章托管执行环境介绍 • 编写 .NET 应用程序 • 编译和运行 .NET 应用程序
编译和运行.NET Framework应用程序 2.2 编译和运行.NET Framework应用程序 • 公共语言运行库工具 • 实时(JIT, Just-In-Time)编译 • 应用程序域 • 垃圾回收 • 编译器选项 • 托管执行的过程 • 元数据 • Microsoft 中间语言(MSIL) • 程序集
编译器选项 2.2.1 编译器选项 • 直接从命令行窗口中编译 • 用 /target 或 /t 指定编译目标 • 用 /reference 或 /r 来引用程序集 >csc HelloDemoCS.cs csc /t:exe HelloDemoCS.cs >csc /t:exe /r:assemb1.dll HelloDemoVB.vb
托管执行的过程 2.2.2 托管执行的过程 源代码 EXE/DLL(MSIL 和元数据) 编译器 类库(MSIL 和元数据 ) 类装载器 JIT 编译器 调用未编译方法 可信任的预编译JIT代码 托管本地代码 执行 安全检查 运行时引擎
元数据 2.2.3 元数据 • 元数据是在编译时嵌入的声明性信息 • 应用程序版本、区域、公钥信息 • 类型成员(方法、字段、属性、事件、嵌套的类型) • 安全许可证信息 • 该程序集所依赖的其他程序集 • 包括所有 .NET Framework文件和资源文件如文本(txt、xml)、声音图像等资源文件
元数据(续) 2.2.3 元数据 • 元数据的作用 • 加载和定位类 • 增强代码安全性 • 解析方法调用 • 提供反射支持 • 可利用特性扩展元数据
Microsoft 中间语言(MSIL) 2.2.4 Microsoft 中间语言(MSIL) • 可被任何支持中间语言的编译器产生 任何兼容公共类型系统(CTS)的编译器(如:cobol、perl、pascal、smarttalk…)都可以产生中间语言代码 • 可被公共语言运行库JIT编译器转变成本地代码 在可以执行代码前,必须将 MSIL 转换为 CPU 特定的本地代码,这通常是通过实时(JIT)编译完成的
.gif .html 程序集 2.2.5 程序集 托管模块 (MSIL 和元数据) 托管模块 (MSIL 和元数据) 程序集 清单 多个托管模块 和资源文件被编译到一个程序集 资源文件
公共语言运行库工具 2.2.6 公共语言运行库工具 • 和MSIL一起工作的运行时实用工具 • MSIL 编译器 (ilasm.exe) 从Microsoft中间语言 (MSIL) 生成最终可执行二进制代码。 • MSIL 反编译器 (ildasm.exe) 检查元数据和托管二进制代码,利用包含 MSI 代码的 PE 文件,创建适合输入到 MSI 汇编程序 (Ilasm.exe) 的文本文件。 • 强名称工具 (sn.exe) 帮助创建带强名称的程序集。sn.exe 提供用于密钥管理、签名生成和签名验证的选项。
实时(JIT, Just-In-Time)编译 2.2.7 实时(JIT, Just-In-Time)编译 • JIT 编译器提供针对特定 CPU 的优化 由于公共语言运行库为每种受支持的CPU结构都提供了 JIT编译器,开发人员可以编写一组可在不同结构的计算机上进行JIT编译和执行的MSIL。 • 代码执行过程 • MSIL 按需生成本地代码 • 为后面的调用保存已编译的本地代码
应用程序域 2.2.8 应用程序域 • 过去进程边界用来隔离应用程序 • 在 CLR 中, 应用程序域提供应用程序之间的隔离 • 以极小的性能损失进行代码类型安全检查来隔离应用程序 • 多个应用程序域可并存于同一个应用程序中 • 能够在不停止整个进程的情况下停止单个应用程序 • 在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源 • 在一个应用程序中的错误不会影响其他的应用程序
多媒体演示 应用程序加载和单文件程序集执行
垃圾回收 2.2.9 垃圾回收 • 垃圾回收在.NET Framework中自动进行对象内存管理垃圾回收优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收执行回收过程时,它检查托管堆中不再被应用程序使用的对象来回收它们占用的内存。 • 不再需要手动进行对象内存的跟踪和管理对象内存的跟踪和销毁都通过垃圾回收引擎来适当地自动进行
回顾 学习完本章后,将能够: • 编写 .NET 应用程序 • 编译和运行 .NET 应用程序
15分钟 实验 生成一个简单的.NET应用程序 练习 1 用C#创建程序 练习 2 使用MSIL反汇编程序