================================================================
目标
================================================================
通过编译和链接生成【单一】的【本地】【可执行文件】(.EXE)的时代已经过去,在 Microsoft Windows 中,应用程序的执行早已演变成为基于 【DLL】(动态链接库)的形式(这样,就可把相同的功能封装到DLL中,程序员就不需要重复的完成相同的功能),而通过 .NET,我们正在向【基于虚拟机】的程序执行模式演化。
特点:单一、本地、可执行
================================================================
Managed Execution(托管执行)
================================================================
1.应用程序的运行层次:
---应用程序
---运行时环境【如Java虚拟机】
---操作系统
---硬件
2.由此,.NET运行的环境如下:
------------------------------------------------------
.NET 应用程序 | .NET Framework Class Library
------------------------------------------------------
Common Language Runtime
------------------------------------------------------
操作系统
------------------------------------------------------
硬件
------------------------------------------------------
3.设计上的权衡
---可移植性 //提升
---安全执行(内存管理) //提升
---速度 //降低
4.Managed Code
C#, VB, J# 编译器会生成受控代码
---需要 .NET Framework 运行和管理的代码,才称为Managed Code
---也可以理解为编译后成为中间语言代码,而不是exe文件。
C++有两种选择
---受控代码(.NET exe/dll)
---非受控代码(native exe/dll)//常用于操作系统级编程和原有应用程序
================================================================
基于组件的设计
================================================================
1.基于组件的应用程序:
----应用程序包含一个或多个组件(dll)//程序不是一个人开发,如可以购买商用的组件
2.基于组件的 .NET的环境说明(CLR 和 FxCL 也是组件)(FxCL: .NET框架的核心类库)
-----------------------------------------------------
EXE文件
-------------|---------------------------------------
JIT Compliler| <-----------.DLL
| <-----------Additional FxCL Components (DLLs)
-------------|---------------------------------------
Object Code |
-------------|---------------------------------------
CLR
-----------------------------------------------------
Os and HardWare
3.Assemblies//程序集
----Assemblies是对 .NET 组件的称呼
----.NET中的部署单元
----1个 assembly = 1 个或多个源文件的编译结果(也就是多个cs文件编译后,生成了一个exe和多个dll文件,因此,部署的时候也要把exe和多个dll文件都要copy到客户的机器上)
4.FxCL assemblies(框架的核心类库)
FxCL assemblies 存储与 GAC 之中
----GAC = Global Assembly Cache//全局程序集缓存,通常为于C:/windows/assembly...下。
----位于本地
----共享
----版本感知
----安全性
----防篡改
================================================================
Assembly 分析
================================================================
1.CLR必须可以找到正确的assemblies
---FxCL assemblies 像我们自己的 assemblies
2.程序执行过程的assembly搜索
---.NET 提供了assembly搜索算法
---可以根据.config文件(类似于.ini文件)自定义assembly搜索
---无需使用注册表(dos下需要注册表注册)
3.assembly搜索算法分析
---应用程序(.EXE)指定将要使用的assembly版本
---在GAC(Global Assembly Cache)中搜索相应版本
---If 未找到 and 存在.config文件 then
--- 到配置文件指定的位置搜索
--- else
--- 到.EXE文件所在的路径搜索
---If 未找到 then
--- 发生错误,程序终止
主要是在三个位置:GAC,配置文件指定的位置,EXE所在的位置
但是,所要搜索的文件版本是如何区分的呢?他是通过Manifest实现的。
4.Manifest
作为mannifest编译到.DLL/.EXE中
【任何一个项目都可以看到“引用”这一项】
----可以通过ILDASM工具查看
----ILDASM = Intermediate Language Disassembler
----Manifest中存储了版本,依赖关系等信息
5.Manifest 包含对其他assembly的引用
----名称,版本,公钥哈希
Manifest不包含
----assembly的代码
----注册信息
----位置信息 (使用assembly搜索算法确定位置)
6.隐含的特性
----无需注册表 //.NET 使用搜索算法搜索路径
----不再发生DLL陷阱 //应用程序不会再使用错误版本
----会不会发生“配置文件陷阱”? //machine config, user config, app config 等等
7.Assembly如何被引用?
通过VS .NET工程文件中的References(引用)文件夹
----在References文件夹中添加引用
================================================================
部署
================================================================
1.DOS时代(Copy)-->Windows时间(安装,写注册表)-->.NET时代(XCOPY)
2.安装到.EXE所在的文件夹中
---最简便,也称作 xcopy deployment
3.将一部分安装到.EXE所在的文件夹中,另一部分在GAC中
---GAC 允许你共享、安装多个版本
4.通过配置文件自定义部署
---可以自定义安装位置,例如安装到某台服务器上
5.“Zero-touch” 部署(smart client的原型)
---通过URL安装: http://server/app/app.exe
---应用程序可以定期自动更新(检测版本信息)
---在VS 2005中进化为ClickOnce部署
6.部署过程中的细节
---怎样编写配置文件?
---怎样将assembly部署到GAC中?
---怎样为assembly赋予版本号?
---怎样保证assembly的防篡改特性?
以上问题将在本系列中第11讲中具体阐述