通过编译和链接生成单一的本地可执行文件( .exe )的时代已经过去,在 Microsoft Windows 中,应用程序的执行早已演变成为基于 DLL (动态链接库)的形式,而通过 .NET ,我们正在向基于虚拟机的程序执行模式演化。
** Managed Execution **
**
**
**
**
软件在运行时( CLR )环境的执行,提高了软件的可移植性可安全性。 **
**
运行 .NET 程序的客户端必须安装 Microsoft .NET Framework
-------Redistributable .NET Framework (20MB)
------- 三个版本: v1.0(2002),v1.1 ( 2003 ), V2.0 (预计 2005 年底)
-------Microsoft Windows Server2003 包含 v1.1
------- 必须安装正确的版本
设计上的权衡:
-------- 可移植性(明显提高)
-------- 安全执行(内存管理)(亦有明显提高)
-------- 速度(第一次运行可能会让你感觉太慢,但是再次执行时会有明显提高,只会比你的本地代码( Native Code )慢一点点。)
CIL ( Common Intermediate Language ),他相当于 CLR ( Common Language Runtime )的汇编语言,你可以通过在命令行提示符下用 idlasm 反汇编一个 .exe 文件来查看。
** 基于组件的应用程序
**
现代软件设计,一个应用程序往往包括一个或多个组件( dll ),在执行过程是由 JIT ( Just In Time ) Compiler 将所有的功能组件编译完成来生成目标代码。
Assemblies 是对 .NET 组件的称呼,同时是 .NET 的一个部署单元,一个 Assembly 是一个或多个源文件的编译结果。
FxCL ( DotNet Framework Class Library ) assemblies 存储在 GAC ( Global Assembly Cache ),它位于你本地计算机,具有共享性,版本感知性,安全性和防篡改性(利用 Public Key Token )注: GAC 中项目的组织和一般文件的组织不同,它允许有相同的文件名。
Assembly 执行原理:程序执行时, .exe 调用 dll 文件,调用是通过 .NET 提供的 assembly 搜索算法来保证应用程序引用的组件能够被找到。搜索算法如下:
1. 应用程序指定将要使用的 assembly 版本
2. 在 GAC 中搜索相应版本
3. If 未找到 and 存在 .config 文件 then
到配置文件所在的位置搜索
Else
到 .exe 文件所在的路径搜索
If 未找到 then
发生错误,程序终止
所以 .NET 应用程序无需使用注册表了
那么,应用程序是怎样指定 dll 文件的版本的呢?
应用程序通过 Manifest 存储版本信息的,若 A 引用 B,Manifest 被编译到 A 的 .EXE/DLL 中。( Manifest 中存储信息和版本信息等,但不包括 assembly 代码,注册信息和位置信息,我们可以通过 ILDASM=Intermediate Language Dissembler 查看)
因此, .NET 也不会发生 DLL 陷阱和“配置文件陷阱”。
** .NET ** ** 应用程序部署
**
1. 安装到 .EXE 所在的文件夹下(最简便,也称 xcopy deployment )
2. 一部分安装到 .EXE 所在的文件夹中,一部分在 GAC 中( GAC 允许共享且可以安装多个版本)
3. 通过配置文件自定义部署(可自定义安装位置)
4. “ Zero-touch ”部署
--- 通过 URL 安装: http://server/app.exe
--- 应用程序可以定期自动更新
--- 在 VS 2005 中进化为 ClickOnce 部署