第二章 生成、打包、部署及管理应用程序与类型(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
(每次重新回来整理看过的内容都有新的收获,上一次看不懂的地方第二次过来就懂了,书后面不明白的地方回头看看就明了。作者的书最大的特点是:书的后面是对前面的深入)