.net2.0之杂七杂八(1)

.NET 2.0相比1.0和1.1版本引入了许多新特性,包括PE文件结构的变化、元数据结构的改进、Ilasm编译器的新功能等。新增的特性支持了更强大的泛型编程,并简化了IL代码编写。

.net 2.0相对.net1.01.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头中的第一项Magic32位对应0x010B64位对应0x020B

 

1.3                    偏移24位的BaseOfData项,64位中无此项。

 

1.4                    SizeOfStackReserve项,32位默认1M64 位默认4M

 

1.5                    SizeOfStackCommit项,32 位默认4KB64位默认16KB

 

1.6                    SizeOfHeapReverse项,32位和64位均为1M

 

1.7                    SizeOfHeapCommit项,32位默认4KB64位默认2KB

 

1.8                    正因为有32/64的区别,所以数据目录DataDirectoryTable的起始位置也不相同,分别是文件偏移96112处。其中第14项自然指向了元数据头。

 

2.       元数据结构

2.1                    元数据头中改变最大的莫过于EntryPointToken项,因为2.0以后该项还可支持EntryPointRVA,既本地入口代码。相应的,Flags项中多出CONIMAGE_FLAGS_NATIVE_ENTRYPOINT0x00000010)。

 

2.2                    2.0多出的三个表:

[42]GenericParam[43]MethodSpec[44]GenericParamConstraint

顾名思义,是为了支持Generic编程。

 

3.       Ilasm新特性

Ilasmmsil的编译器,它在2.0中也有些新变化,也就是说msil2.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.01.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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值