.net 2.0相对.net1.0和1.1有些新东西,这里大致罗列一下,也算备份。3.0暂时没装,等明年吧。
1. PE文件结构
1.1 COFF头中的Characteristics项,对于常用托管代码编译器,生成的值通常为0x010E,既IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_LOCAL_SYMS_STRIPPED | IMAGE_FILE_32BIT_MACHINE。而对DLL文件则为0x210E,既再添加一个IMAGE_FILE_DLL。
对于64位可执行程序,则去除IMAGE_FILE_32BIT_MACHINE。
1.2 PE头中的第一项Magic,32位对应0x010B,64位对应0x020B。
1.3 偏移24位的BaseOfData项,64位中无此项。
1.4 SizeOfStackReserve项,32位默认1M,64 位默认4M。
1.5 SizeOfStackCommit项,32 位默认4KB,64位默认16KB。
1.6 SizeOfHeapReverse项,32位和64位均为1M。
1.7 SizeOfHeapCommit项,32位默认4KB,64位默认2KB。
1.8 正因为有32/64的区别,所以数据目录DataDirectoryTable的起始位置也不相同,分别是文件偏移96和112处。其中第14项自然指向了元数据头。
2. 元数据结构
2.1 元数据头中改变最大的莫过于EntryPointToken项,因为2.0以后该项还可支持EntryPointRVA,既本地入口代码。相应的,Flags项中多出CONIMAGE_FLAGS_NATIVE_ENTRYPOINT(0x00000010)。
2.2 2.0多出的三个表:
[42]GenericParam、[43]MethodSpec、[44]GenericParamConstraint,
顾名思义,是为了支持Generic编程。
3. Ilasm新特性
Ilasm是msil的编译器,它在2.0中也有些新变化,也就是说msil在2.0中有些新语法。
3.1 支持别名(aliasing),可以使代码量减少。看个例子就明白了。
.typedef [mscorlib]System.Console as TTY
.typedef method void TTY::WriteLine(string) as PrintLine
…
ldstr “hello”
call PrintLine
3.2 支持编译控制关键字,类似C++,不过不是全部支持。主要是如下几个:
#include “xxxx.il”
#define Sym
#define Sym “sometext”
#undef Sym
#ifdef Sym
#ifndef Sym
#else
#endif
3.3 .this关键字。用来指示当前类。
ldsflda int32 SomeClass::SomeField
可以简写为
ldsflda int32 .this::val
3.4 1.0和1.1中要求类在引用前需要声明(forward declaration),2.0中不需要了,ilasm会为每遇到一个还没有定义的类时,自动添加一个虚的类,保证编译正常进行,直到编译至真正的定义代码时,将这个临时的类替换为代码中的定义的类。这种方法叫作类的bookkeeping。
这时,ilasm生成(emit)类的顺序是在代码中遇到的顺序,如果你想手动定义类的生成顺序,使用.typelist关键字。
3.5 这个应该不算2.0的新特性,不过值得注意。
C#中表示类的继承关系用“.”,如namespace.class.nestclass
C++/CLI中用“::”namespace::class::nestclass
而msil中用“/”表示nest class,如namespace.class/nestclass。
暂时这么多,下次go on。
.NET 2.0相比1.0和1.1版本引入了许多新特性,包括PE文件结构的变化、元数据结构的改进、Ilasm编译器的新功能等。新增的特性支持了更强大的泛型编程,并简化了IL代码编写。

934

被折叠的 条评论
为什么被折叠?



