编程资料集中营
 | 网站首页 | 文章中心 | 编程资料2 | 软件下载 | BT下载 | 八卦星闻 | 音乐在线 | 在线游戏 | 免费电影 | 给我留言 | 
Reflector: Get the secret inside .NET assemblies.
        
【字体:
Reflector: Get the secret inside .NET assemblies. 进入问吧

本站地址:http://www.bajiao123.com

作者:admin    文章来源:本站    点击数:    更新时间:2007-4-9    
nbsp;       goto Label_00D9;            Label_00CD:                  Console.WriteLine("Invalid Option");            Label_00D9:                  num1 += 1;            }            goto Label_017C;      }      string text4 = Console.ReadLine();      if (text4 == null)      {            goto Label_0170;      }      text4 = string.IsInterned(text4);      if (text4 != "IL")      {            if (text4 == "C#")            {                  goto Label_014C;            }            if (text4 == "VB.NET")            {                  goto Label_0158;            }            if (text4 == "Delphi")            {                  goto Label_0164;            }            goto Label_0170;      }      Console.WriteLine("IL");      goto Label_017C;Label_014C:      Console.WriteLine("C#");      goto Label_017C;Label_0158:      Console.WriteLine("VB.NET");      goto Label_017C;Label_0164:      Console.WriteLine("Delphi");      goto Label_017C;Label_0170:      Console.WriteLine("Invalid Option");Label_017C:      enumerator1 = list1.GetEnumerator();      try      {            while (enumerator1.MoveNext())            {                  obj1 = enumerator1.Current;                  Console.WriteLine(((string) obj1));            }      }      finally      {            disposable1 = (enumerator1 as IDisposable);            if (disposable1 != null)            {                  disposable1.Dispose();            }      }}

反编译的代码在功能效果上与原代码是相同的,但是个人认为翻编译的代码的风格却不怎么棒,尤其是充满goto语句,乍一看我真得昏了过去。代码把原来的switch block全换成if block,将foreach block全换成while。我猜是因为它是从IL那里翻译出来的,而IL就是一门基于堆栈的语言,在IL里面没有流程控制语句,全部使用goto + Label模拟,于是得到这样的结果。

除此之外,我还发现一些很特别的东西,请留意这一句:text3 = string.IsInterned(text3); 它其实反映了.NET的字符串处理方式,使用了一种叫做字符串驻留(String Interning)的技术,该技术是为了减轻字符串的操作为系统带来的性能损失,详细解释请参见《Microsoft .NET框架程序设计(修订版)》的262页。另外我们看到原代码最后的foreach被翻译成一个try...finally block,在try里面实现foreach的功能,然后再finally里面自动为每一个enumerator试着调用IDisposable接口来释放资源,真是想得周到相信对应的IL也会有同样的“设施”,如果你懂IL的话,而你又肯定在这里不需要这样一个finally的话,你可以手动优化一下,呵呵。

翻译后的代码是有点复杂和混乱,不过,你可以从中窥探.NET的(部分)运行机制(而这种窥探原本是应该使用IL的),并了解到简单的C#代码背后,编译器在默默地为我们作了不少的工作!最后,我们还会惊喜地发现,Reflector不但支持反汇编成C#,还支持IL、VB.NET、Delphi,这下子爽了,我们可以比较并学习这些语言,以前我们用ILDASM来反汇编C#写的程序来学习IL,现在我们可以用Reflector反汇编C#写的程序来学习VB.NET和Delphi啦!当然,由于篇幅的问题,我不可以再往里面灌水(依次加入IL、VB.NET、Delphi反编译的代码)。

另外,你会发现这些源代码的某些地方,通常是类型名称或者方法名称又或者属性会是一个连接,按下去看看有什么事发生!是不是连接到该东西(类型或者方法或者属性)的.NET基类库的反编译代码上了?

最后,在文章的结束,我还有一个惊喜给你,就是Reflector本身是一个.NET程序,这意味着它还可以反汇编它自己,不幸试试看!

噢,补充一点,当你运行Reflector后,它会在它所在的文件夹会生成一个叫Reflector.cfg的文件,这个不是XML文件,是一种INI格式的配置文件,请留意该文件的[AssemblyLoader]区段,有什么发现了没有?好了,这次的介绍就到此为止,希望你发现更多的东西来跟我分享!

可以问你一个问题吗?当你看完这篇介绍后,你有没有想过使用这个工具?有多想?能给我一个回复么?(完全没兴趣、感

上一页  [1] [2] [3] [4] 下一页

   

进入问吧

Reflector: Get the secret inside .NET assemblies.

本站地址:http://www.bajiao123.com

文章录入:admin    责任编辑:admin 
编程资料集中营