20080811 - 使用Reflactor反编译.Net程序的经验


相信大多数.Net程序员都有使用Reflactor的经历。无论出于什么目的,当用Reflactor反编译托管程序后,还想对其代码加以修改,那么本文所列举的可能是一份有用的参考。

 

用Reflactor的FileGenerator插件反编译代码后可以得到包括项目文件的源代码,但代码中存在各种问题,一般无法一次编译通过,以下将详谈这些问题:


枚举问题

 

为了代码可读,可能需要花点时间查阅metadata把int值修改回枚举值,尤其是想利用窗体设计器的,VS2008可能还不理解int值。


属性问题

 

比如一个叫Names的属性被反编译后,可能还原为的set_Names(names),get_Names()方法,逐个替换可能很慢,可采用正则表达式整体替换。
对于set_Xxx(xxx)方法,可替换
set_{[a-z]*}\(

\1 = (
对于get_Xxx()方法,可替换
get_{[a-z]*}\(\)

\1
然后,再修复个别被误换的方法。


委托和回调函数问题

 

一般会被还原为add_Xxx(MethodsName)方法,需要改为 += MethodsName


资源问题

 

需要使用.Net Framework SDK 下的 resgen.exe 工具,反编译嵌入资源文件*.resources为*.resx文件,
语法为:ResGen.exe *.resources *.resx,然后将*.resx包含入项目,就会自动和同名的窗体文件*.cs关联,如果没有关联可采用先排除再添加大法,一一搞定。


命名空间问题

 

如果需要切换到IDE的窗体设计器,而不出错,则还需要在*.cs中添加比如System.Windows.Forms的命名空间前缀。


窗体设计器识别问题

 

需要把以下代码
ComponentResourceManager manager = new ComponentResourceManager(typeof(ClassName));
替换为
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ClassName));
窗体设计器才能正常识别。

 

 

0
0
(请您对文章做出评价)
« 上一篇:20080726 - Castle项目创始人加入微软
» 下一篇:20080813 - TextBox 类 ReadOnly 属性脚本不兼容问题

posted on 2008-08-11 11:00 Eric Lee 阅读(2852) 评论(2)  编辑 收藏 所属分类: C#

评论

#1楼 2008-08-11 13:05 Solog      

学习了.   回复  引用  查看    

#2楼 2008-08-11 20:53 BoyLee      

我就会拖进去看一下.学习   回复  引用  查看    

导航

公告

<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

新闻分类

最新评论

阅读排行榜

评论排行榜