ipointer

给我最爱的宝宝
随笔 - 42, 文章 - 0, 评论 - 202, 引用 - 0
数据加载中……

维护旧版本项目的一些方法

        今天碰到一个比较棘手的问题,一个做了2年多的项目上反映了一个问题,问题比较简单,但是涉及改动的dll引用的dll非常多,而且项目上的版本已经很旧了,这一处的改动会影响到几乎所有的dll的更新。单独更新这个dll是不可能了,也不能做完面的版本升级(公司的规定,可能升级是要花钱的,呵呵),而且vss中也清过了,没有留当时的代码。如果dll也能像asp页面一样直接修改,保存后就运行就好了。
        查了下资料,发现两种方法:(1)使用ildasm和ilasm两个自带的工具,加上IL(2)使用.NET Reflector插件FileDisassembler还原代码,重新编译。
        首先说一下第一种方法,使用ildasm打开项目上发过来的dll,在file下有dump菜单(如果是中文版就是文件下的转储菜单),弹出新窗口确定即可,生成后缀为.il的文件。下面就需要懂一点il语言,以前一直认为学习这个il语言没什么用,今天只能现学一把,因为问题比较小,4、5行就搞定了。保存之后,使用ilasm重新编译这个il文件。使用命令如ilasm.exe GSP_WorkflowEngine.il /dll /output=GSP_WorkflowEngine.dll,就OK了。不过在写il的时候还是碰到了很多问题,一直编译出错,还是il没有写好,看来学习il还是很多好处的。
        第二种就是使用.NET Reflector插件FileDisassembler,先把这个插件下好挂上,菜单中就会出现FileDisassembler这个菜单项,打开要反编译的dll,就可以生成出源码,即使用了混淆器,要修改的问题也很容易找到,毕竟我们对自己的代码还是很熟悉的。重新建解决方案,添加需要引用的dll,重新编译就OK了。

        写在最后,这两种方法本质上原理是一致的,我个人觉得,如果对il掌握的非常好的话,第一种方法是非常爽的,即使是在项目现场,对一些小问题修改都是相当轻易的。由此还想到.net的安全性,对于非强命名的dll来说,这种il级别的修改都是有效的,但对于软件的保护是相当不利的,我们是很容易从il中找到验证正版的代码信息,直接去掉,重新编译就破解了;对于入侵者来说,也是很容易修改系统上.net程序的运行方式的。

posted on 2007-03-28 00:45 栖息的熊 阅读(2766) 评论(13)  编辑 收藏 所属分类: .net学习

评论

#1楼    回复  引用  查看    

方法不错,可是制度有问题啊
2007-03-28 08:47 | 阿齐      

#2楼    回复  引用  查看    

我觉得制度和方法都有问题

开发过的项目居然没保留源代码,并且还是正式使用的系统。自己把自己弄麻烦了。
更新版本居然还要花钱?!!暂时没法理解

2007-03-28 08:58 | yzx110 [未注册用户]

#3楼    回复  引用  查看    

正在使用的程序没有备份的版本?制度有问题。
2007-03-28 09:54 | 随心所欲      

#4楼    回复  引用  查看    

晕!!我最怕没有源码了. ( 水晶报表杀手 -- e表, 它避免了大量的复杂SQL编写以及编程来准备数据。轻松实现复杂的统计报表,详见: http://fc8264.meibu.com )
2007-03-28 10:00 | e表      

#5楼    回复  引用  查看    

我也遇到过这种情形,修改il代码固然可以,不过始终是麻烦。
后来我就干脆在原aspx和cs文件中间插入自己的类,相对方便多了。
因为aspx是继承于cs的,所以可以自己写一个类继承原cs里边的类,再修改aspx继承于自写的类,配合reflector可以对必要的部份进行修改,基本上会方便和快捷很多。
2007-03-28 10:10 | Klesh Wong      

#6楼    回复  引用  查看    

@Klesh Wong
同意,我也这样干.
2007-03-28 10:19 | 阿牛      

#7楼    回复  引用  查看    

我再推荐一个Killer级的工具:Xenocode Fox 2007 Community Edition
可以把DLL反编译成项目。至从知道后,就一直汗啊。
2007-03-28 10:35 | [David.S]      

#8楼    回复  引用  查看    

楼上真傻
2007-03-28 14:23 | 楼上真傻 [未注册用户]

#9楼    回复  引用  查看    

问题很严重啊
1.项目完成后起码应该备份,刻盘,怎么能说清就清掉呢。
2.修改的问题简单,但是涉及到的dll很多,说明程序耦合度高,或者重复代码多。
3.最要命的是,楼主不但不反省,反而把这种做法看作是一种维护旧版本的方法,
如果别人看了这篇文章也这样搞,那可真是误人不浅。
2007-03-28 14:49 | Cure      

#10楼    回复  引用  查看    

要说明几个问题:
(1)我们做的是产品,产品每隔一段时间会发一个版本,项目上一般交付以后就不怎么升级产品了,每次产品的升级都是要花费的。这是公司的规定,我们无法干涉。
(2)vss源代码管理也是由研发管理部管理的,一般他们会把很久以前的代码清理掉,这个我们也无法干涉。
我上面提到的方法也是没有办法的办法,如果有好的办法,我也不会自己给自己找麻烦。
(3)本人接手这一块也只有一年多的时间,以前的代码自然不会有。
这篇文章也是给各位碰到相同问题的兄弟们提供一些办法,绝无误导之意。
2007-03-28 17:27 | LEX [未注册用户]

#11楼    回复  引用  查看    

@Klesh Wong
能否说形象一点?
2007-03-28 17:39 | 马哥      

#12楼    回复  引用  查看    

楼主这样做也没办法。其实感觉这个也不是很复杂的,是我也这么做。
2007-03-30 16:12 | scotoma      

#13楼    回复  引用  查看    

@Cure
博主提供了一种修改.NET下DLL的好办法,有代码的话谁不想改代码啊。阁下明显是强词夺理。
2007-09-07 13:56 | rler [未注册用户]

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
向地震灾区捐赠爱心