很多人可能都不知道.Net的底层还有这么一种语言,包括我。直到前几天,看到一本书上详细介绍了这个东西后,才开始对MSIL这个东西开始感兴趣了。
事实上,使用c#、vc或者vb.net的程序员,可能永远都不会接触到MSIL,因为它太底层了。MSIL的作用,就相当于以前的汇编语言, 它只是把C#等高级语言编译成的中间代码,解释为原生的机器代码来运行。不过,花一点时间来了解一下这个东西,还是蛮有意思的一件事。
MSIL有一些指令,这些指令就相当与以前的汇编语言指令,只不过这是虚拟机上的指令而已。常见的MSIL指令有这些: add,相加结果入栈; box和unbox,装箱和拆箱;call,调用某方法;newobj,创建一个对象;等等等等。。。。
了解这些有什么用,别急,慢慢看,接下来我们来看几个有意思的东西。
如果你的机器上装有MSN,那么请到命令行下敲入这个命令(这几个exe或者位于.net安装目录下的sdk目录,要么位于window目录下的.net里的framework目录里的bin目录,所以使用前需要先设置好path):
tlbimp msmgs.exe /out:Messenger.dll
tlbimp.exe这个是一个.net提供的将com组件转化为.net的装配件的东西,有意思吧,经过这一步,你的msn就有了一个可以被.net语言调用的装配件dll文件了。
那这又怎样,.net不是直接可以调用com吗,干吗这么麻烦。嘿嘿,别急,接下来,就来对这个装配件动动手脚了,命令行:
ildasm /text Messenger.dll /out:Messenger.il
ok,使用任何一个文本编辑器打开这个.il文件,你看到了什么?呵呵,所有类的申明都在这里了,你可以看到类似这样的语句:
.class private auto ansi sealed xxxxx
这是一个私有的类,如果你在正常的.net开发环境引入com组件,是看不到这个类的,把它改为public,顺便再把所有的类似这样的东西改为public,保存,呵呵,真好,现在我有自己的msn装配件了。但是还不行,还差一步,这还只是IL文件,不是dll。那么继续命令行:
ilasm /dll Messenger.il
ok,大功告成,好好比较一下这个新的dll和微软提供的dll有什么区别吧,这样的方法适用于很多com方式生成的程序,QQ也是。^_^