.NET框架程序设计--生成,打包,部署及管理应用程序与类型(1:程序集的PE格式)
.NET框架程序设计--生成,打包,部署及管理应用程序与类型(1:程序集的PE格式)
(一).NET框架部署的目标
提到Microsoft的OS--Windows,也许很多人立刻想到了她的复杂以及不稳定性,一个重大的原来是因为运行在Windows上各种程序都难以避免的DllHell(DLL地狱)问题,还有安装程序的复杂过程,以及程序对客户的不透明性,使得程序可以潜在地执行破环代码,修改注册表,发送客户的隐私等等这些客户不希望发生的行为。
.NET框架对应用程序的部署,改良甚至修正了上述问题:DllHell基本解决(通过简单的Copy就可以部署程序,可谓是真正的绿色软件),代码访问安全机制模型(Code Access Security)更是在程序的安全方面迈出了一大步,我们(程序设计者)可以自己决定程序集的安全性,Windows用户可以对安装程序具有更多的控制。
(二)将类型生成模块(.netmodule或者exe,dll文件(后两者就是Assembly程序集))
我们可以通过编译器比如csc.exe来将类型生成这些模块.
(1)CUI(Control User Interface控制台界面应用程序);比如:csc.exe App.cs
(2)GUI(Graph User Interface图形界面应用程序);比如:csc /target:winexe App.cs
(3)Dll(应用程序集,和以前概念的Dll--动态连接库应该有所区分);比如: csc /target:library App.cs
(4)netModule(单个的托管模块,这些东西非简单集合组成Dll,更有助于我们管理类型);比如:csc /target:module App.cs
抛开netModule,先看看Dll和exe(CUI,GUI)的内容的格式
通过csc生成的Exe文件是一个标准的(托管)PE文件,可以运行于32,64位的Windows平台上。
这个托管PE包括:
(请参考http://www.cnblogs.com/caca/archive/2004/10/20/54810.html)
(1)PE表头
(用来表明这个程序是Windows应用程序,当然不是这么简单)
(2)CLR表头
(专门用于那些需要CLR才能运行的托管模块,包含元数据的主版本和次版本号,如果是exe文件还有一个标示入口点方法的MethodDef标记,以及一个可选的强命名数字签名,还有一些元数据表的大小和偏移量,察看SDK/include中的CorHdr.h的IMAGE_COR20_HEADER结构来得到CLR表头的准确格式)
typedef struct IMAGE_COR20_HEADER
{
// Header versioning
ULONG cb;
USHORT MajorRuntimeVersion;
USHORT MinorRuntimeVersion;
// Symbol table and startup information
IMAGE_DATA_DIRECTORY MetaData;
ULONG Flags;
ULONG EntryPointToken;
// Binding information
IMAGE_DATA_DIRECTORY Resources;
IMAGE_DATA_DIRECTORY StrongNameSignature;
// Regular fixup and binding information
IMAGE_DATA_DIRECTORY CodeManagerTable;
IMAGE_DATA_DIRECTORY VTableFixups;
IMAGE_DATA_DIRECTORY ExportAddressTableJumps;
// Precompiled image info (internal use only - set to zero)
IMAGE_DATA_DIRECTORY ManagedNativeHeader;
} IMAGE_COR20_HEADER;
(3)元数据
元数据是一些表的集合,这些表分成3类:定义表,引用表,清单表:
定义表:例如ModuleDef,TypeDef,MethodDef,FiledDef,ParamDef,PropertyDef,EventDef......
引用表:例如AssemblyRef,MouuleRef,TypeRef,MemberRef......
清单表:例如AssemblyDef,AssemblyRef,FileDef,ManifestResoureeDef,ExportedTypesDef......
(程序集中存在此表,.netmodule中没有)
清单为程序集的使用者和其各个部分之间提供了一层间接关联,也使得程序集得以实现自描述,清单记录了程序集中所有的其他文件,但是其他文件并不知道他们是某个程序集的一部分。
(4)IL代码
程序源代码中中括号{}中的部分被编译成为IL语言。
(附)具体看看hello.cs生成的MetaInfo(通过ILDasm的ctrl+M快捷键来查看)
public class Hello
{
static void Main()
{
System.Console.WriteLine("Hello c# world !");
}
}|
ScopeName : Hello.exe Global fields Global MemberRefs TypeDef #1 Method #2
TypeRef #2 (01000002) TypeRef #3 (01000003) Assembly
|
下篇:.NET框架程序设计--生成,打包,部署及管理应用程序与类型(2:Assembly的生成以及版本信息)



浙公网安备 33010602011771号