通过编译和链接生成单一的本地可执行文件(.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部署