.NET应用程序的执行方式
目标
通过编译和链接生成单一的本地可执行文件(.EXE)的时代已经过去,在Microsoft Windows中,应用程序的执行早已演变成为基于DLL(动态链接库)的形式,而通过.NET,我们正在向基于虚拟机的程序执行模式演化。
主要内容
l Managed Execution(受控执行或托管执行)
l 基于组件的设计
l Assembly分析
l 部署
Managed Execution
1. 软件在运行时环境中执行;
2. 可移植和安全执行;
Java
基于运行时环境:JVM
——JVM = Java Virtual Machine
——JCL = Java Class Library
.NET
基于运行时环境:CLR,FxCL
——CLR = Common Language Runtime
——FxCL = Framework Class Library
.NET软件开发
优点:可以选择你的开发语言和平台
运行.NET程序的客户端必须安装Microsoft.NET Framework
设计上的权衡
1. 可移植性;
2. 安全执行(内存管理);
3. 速度?
Managed Code
C#、VB、J#编译器会生成受控代码
——需要.NET Framework运行和管理的代码
C++有两种选择
1. 受控代码(.NET exe/dll)
2. 非受控代码(native exe/dll)——常用于操作系统级编程和原有应用程序
CIL(Common Intermediate Language)
1. CIL相当于CLR的汇编语言
2. Managed code == CIL code
基于组件的应用程序
应用程序包括一个或多个组件(dll)
基于组件的.NET
CLR 和 FxCL 也是组件Assemblies
1. Assemblies是对.NET组件的称呼;
2. .NET中的部署单元(1个assembly = 1个或多个源文件的编译结果)
FxCL assemblies存储与GAC之中
l GAC = Global Assembly Cache
l 位于本地
l 共享
l 版本感知
l 安全性
l 防篡改
l Some pre-JIT
Assembly分析
CLR必须可以找到正确的assemblies
——FxCL assemblies像我们自己的assemblies
程序执行过程的assembly搜索
1. .NET提供了assembly搜索算法
2. 可以根据.config文件(类似于.ini文件)自定义assembly搜索
3. 无需使用注册表
算法分析
l 应用程序(.EXE)制定将要使用的assembly版本
l 在GAC(Global Assembly Cache)中搜索相应版本
l if 未找到 and 存在.config文件 then
到配置文件制定的位置搜索
else
到.EXE文件所在的路径搜索
l if 未找到 then
发生错误,程序终止
.NET如何发现版本信息
作为manifest编译到.DLL/.EXE中
l 可以通过ILDASM工具查看
l ILDASM = Intermediate Language Disassembler
l Manifest中存储了版本、依赖关系等信息
Manifest
l 包含对其他assembly的引用(名称、版本、公钥哈希)
l 不包含(assembly的代码,注册信息,位置信息(使用assembly搜索算法确定位置))
隐含的特性
l 无需注册表(.NET使用搜索路径)
l 不再发生DLL陷阱(应用程序不会再使用错误版本)
Assembly引用
l 通过VS.NET工程文件中的References(引用)文件夹
l 在References文件夹中添加引用
部署
l 安装到.EXE所在的文件夹中(也称为xcopy deployment)
l 将一部分安装到.EXE所在的文件夹中,另一部分在GAC中(GAC允许你共享、安装多个版本)
l 通过配置文件自定义部署(可以自定义安装位置,例如安装到某台服务器上)
l “Zero-touch”部署
通过URL安装:http://server/app/app.exe
应用程序可以定期自动更新
ClickOnce部署