** 第二章 ** ** 生成、打包、部署及管理应用程序与类型( 1 ** ** )
** (这一章内容还是挺多,加上本人耐心有限,把这章也分两部分整理。不知道有没有朋友在看我的笔记,急性子的朋友就将就一点吧)
** 2.1 .NET ** ** 框架部署目标 **
这一节里作者主要讲了为什么“多年来, Windows 一直背负着一个复杂和不稳定的坏名声”。而 .NET 的部署目标就是想克服这些不足之处:
1 、公司升级原来的代码复杂,它必须保证“向下兼容”,这得花费大量的时间进行测试,而且结果效果也难说;
2 、就是著名的“ DLL hell ” (DLL 地狱 ) ,当你在机器上安装新的应用程序时,会顺坏原有的应用程序,就时通常说的冲突;( 前两天就有个同事的 _ XP _ _ 机器上一装瑞星就开不了,瑞星以前冲突的机会还是很小的 _ )
3 、安装过程复杂。大多应用程序的安装都会影响到系统的各个部分。无论程序员打包程序、安装及从机器上删除都是很令人烦恼;( 这个体会人人都有吧,最恨的就是删除不彻底,垃圾文件太多 )
4 、安全问题。最突出的问题就是“ Web 应用程序”在用户意识不到的情况下就被安装到机器里( 木马,就是木马,还有那个什么“不管三七等于什么”的那个网站也让人……。印象中 _ .NET _ _ 中的 Web _ _ 页中如果没有和客户端的交互是不可能操作本地文件的,这样是个解决方案 _ )
** 2.2 ** ** 将类型生成为模块 **
1 、例子:
public class App {
static public void Mian(System.String[] args) {
System.Console.WriteLine(“Hi”);
}
}
程序定义了自己的一个类型( App ),同时使用了微软 .NET 的类型( System.Console )。上面是一个 C# 程序,生成应用程序执行下面的命令 ( 假如加码的源文件是 App.cs) ( 今天看见 _ CSDN _ _ 里有人讨论它的读法“ C _ _ 井”,我觉得不好听,微软提供的标准读法是 C-Sharp _ _ ,我倒认为“ C _ _ 叉”比较顺口,习惯了 _ ) ( cs _ 好像很吃香,编程可以碰到,游戏里又有 _ ) :
csc.exe /out:App.exe /t:exe /r:MSCorLib.dll App.sc
解释:
/out:App.exe ――告诉编译器生成的可执行文件名,默认时也是生成这个文件;
/t:exe ――生成的文件类型为 Win32 控制台应用程序 CUI ( /t[arget]:exe ) ;windows 里支持 GUI 和 CUI 。不代此参数时生成的就是 CUI ,也可以用“ /t:winexe ”生成 GUI ;
/r:MSCorLib.dll ――因为例子中引用的类 System.Console 包含在“ MSCorLib.dall ”文件里头, /r[eference]:MSCorLib.dall 就是让编译器到 / MSCorLib.dll 文件标识的程序集中查找用到的外部类型。 MSCorLib.dll 是非常特殊的一个文件,所以 C 叉编译器会自动应用该程序集;
从上面分析上面的命令也可以写成:
csc.exe App.sc
看过第一章上半部分的朋友应该知道,这里生成的就是一个 PE 文件。
** 2 ** ** 、 PE ** ** 文件中的元数据,它包含三类表:定义表、应用表和清单表。 ** 下面说明一下前两者,
** a. ** ** 常见的元数据定义表: ** ( 自己定义的类的 __ _ 信息 _ ) ** **
** ModuleDef ** ** ―― ** 包含一个托管模块的条目。条目包括模块的文件名和扩展名(不含路径)、一个模块版本 ID (如 app.exe ); ** **
** TypeDef ** ――包含托管模块中定义的每一个类型(如类型 app );
** MethodDef ** ――包含托管模块中定义的每一个方法,(每个方法条目都包含一个指向 ParamDef 表对应条目);
** FieldDef ** ** ―― ** 包含托管模块中定义的每一个字段;
** ParamDef ** ――包含托管模块中定义的每一个参数;
** PropertyDef ** ――包含托管模块中定义的每一个属性;
** EventDef ** ――包含托管模块中定义的每一个事件;
** b. ** ** 常见的元数据应用表 : ** ( 引用别人定义的类的信息 ) ** **
** AssemblyRef ** ** ―― ** 包含托管模块引用的每一个程序集。每个条目包括绑定程序集所必需的信息:程序集名称(不包含扩展名)、版本号、语言文化和共有密钥标记,还包括一些标记和一个散列值。( 这些名词这里看得糊没关系,书的后面还会详细讲到 );
** ModuleRef ** ――托管模块有时引用到的在同一程序集其他不同模块内的类型,它就包含了这些模块的信息;
** TypeRef ** ――包含托管模块引用的每一个类型的信息,每个条目包括类型的名称和一个指向类型所在位置的指针;
MemberRef ――包含托管模块引用的每一个成员的信息,每个条目包括成员的名称,成员的签名,以及指向 TypeRef 表中对应条目的指针;
要查看托管 PE 文件中的元数据可以用 ILDasm.exe : ILDasm /Adv App.exe
( _ 每次重新回来整理看过的内容都有新的收获,上一次看不懂的地方第二次过来就懂了,书后面不明白的地方回头看看就明了。作者的书最大的特点是:书的后面是对前面的深入 _ )