ILSpy工具使用
Reflector是.NET开发中必备的反编译工具。即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善。举例说明,它有一个可以查看程序集完整名称的功能,请看下图
这里的Name,是标识一个程序集的完整标识,当GAC中存在程序集的多个版本时,这个名称是唯一的识别名称。
但是,Reflector很早就转向收费软件了,需要购买许可才可以使用。对于耻于用盗版的朋友,通常会放弃。有朋友说,Reflector并没有增加更霸道的功能,却转向收费,令人费解。再看看市场上的.NET反编译软件,被Reflector击溃。
一提到Reflector,说到.NET反编译,Reflector常常是默认的首选工具。
这里提起一下Visual Studio的垄断。Visual Studio占据了.NET开发工具系列的绝对垄断地位。在.NET 1.x时代,还有C# Builder,Delphi.NET来使用和体验,一争高低。可是到后来,.NET Framwork更新频繁,动辙在编译器级别,和语言层面做更新,这令第三方的软件开发工具商非常苦恼,这些工具也从市场上慢慢消声匿迹,几乎没有第三方的软件开发商愿意开发.NET开发工具与Visual Studio一争高低。没有了竞争,进步的速度要慢很多。Visual Studio 2008差不多就是Visual Studio 2005+SP的替代品,在工具层面,Visual Studio 2005 SP1加上了Web Application,就是Visual Studio 2008。虽然说语言层面是进步了很多,.NET 3.0,.NET 3.5,LINQ, 框架方法增加:WCF,WPF,WF,但是,我一直认识从2005到2008,它在工具层面没有什么进步。
SharpDevelop 是除Visual Studio外,另一个可选择的唯一的.NET开放工具,并且它是开源的。它提供的功能也相当不错,几乎就是在重写Visual Studio。最新的版本中,直接增加了对Visual Studio的解决方安案文件和项目文件的支持。ILSpy是SharpDevelop小组的反编译工具,也是开放源代码的,今天来介绍一下它的调试器和反编译器,以让那个收费的,却没有增加霸道功能的Reflector out。
ILSpy的界面与Reflector相似,左边以树型控件显示程序集和它的类型,右边是对应的源代码。基础的反编译功能,与Reflector相比,丝毫不差,甚至有时候用Reflector无法反编译(因为加密)的程序集,用ILSpy可以反编译。
Decompiler 反编译器
基础的类型反编译功能都具备,现在只支持把源代码反编译为C#和IL语言,不支持VB。
当需要找的程序集是.NET框架时,可以直接从菜单File—Open from GAC中打开需要查看源码的程序集。
代码保存功能也做得不错,当点击一个类型时,选择File->Save Code会反编译当前的类型并保存到指定的文件中,当选择程序集时,Save Code保存为一个项目(csproj)文件,并且把它所有的类型加到这个项目中。
Debugger 调试器
这里要说的调试器,不是指Visual Studio的源码级别的调试器,而是指程序集的调试器。Reflector有个Addin,可以直接附加在Visual Studio中,调试第三方的类型库,而不需要把第三方的类型库反编译后,以源码的形式添加到项目中。
ILSpy也有这个功能,直接对第三方的程序集进行调试,有两种选项
如果第三方类型库是可执行程序(EXE),可以用Debug an executable来启动这个程序。
如果第三方类型库是程序集(DLL),可以用Attach to running application来附加,以启动程序集的调试。
从上面两张图中已经可以看出它的用法,和调试源代码一样。在需要监视变量值的方法的地方,设置断点,当程序运行到此时,就可以通过监视窗体来观察变量的值。从ILSpy的状态栏中看出,上面的第一张图是正处于调试状态,第二张图,是准备就绪,可以进行调试。
这两者的区别是,Attach to a running application调试时,如果代码经过编译器优化,则监视器会无法得到它的值。
如图所示,无法显示正在调试的变量num的值,因为代码已经经过优化。官方推荐的方式是Debug an executable
与在Visual Studio中调试.NET源代码一样,你可以Step into,Step over,continue,同时状态栏会显示就绪(stand by),运行中(running),正在调试(debugging)。
除了调试程序集的C#/VB形式的代码之外,也可以以IL代码形式调试,如下图所示
由此看来,这还是相当不错的调试IL代码的工具。工具可以促进学习的效果,学习领悟之后,又可以推进工具的发展,这就是知识的无止境的发展。
ILSpy的debugger是以插件形式存在的,请确保包含ILSpy.Debugger的Plugin。
根据我们的理解,调试.NET程序集一定需要PDB文件才可以。然而ILSpy却没有产生PDB文件(no PDB files are generated),而且它不可以调试ASP.NET Web application和Web 服务。
这其中的原理,不甚明白。compiler/debugger一直是我喜爱的技术主题,但学识肤浅,无法分享。
Reflector会检测到系统时间超过了它预设的时间,如果不升级,它会主动删除自己,从你的电脑中out掉。如果你对此很烦恼,那就让它out吧,你可以有另一个选择,试试ILSpy,或许会带来一丝的惊喜。
ILSpy工具使用的更多相关文章
- ILSpy反编译工具之C#反汇编
1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.NET Framework 4.0. ...
- C#反编译工具ILSpy 反汇编
ILSpy反编译工具之C#反汇编 1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.N ...
- 【转载】关于 .Net 逆向的那些工具:反编译篇
在项目开发过程中,估计也有人和我遇到过同样的经历:生产环境出现了重大Bug亟需解决,而偏偏就在这时仓库中的代码却不是最新的.在这种情况下,我们不能直接在当前的代码中修改这个Bug然后发布,这会导致更严 ...
- FtpDataStream中的隐藏问题
最近在使用FtpWebResponse.GetResponseStream方法时遇上个问题——Stream在未关闭之前就报出了ObjectDisposedException.刚开始十分困惑,因为一直用 ...
- Scut游戏服务器免费开源框架--快速开发(2)
Scut快速开发(2) Python脚本开发 1 开发环境 Scut Lib版本:5.2.3.2 需要安装的软件 a) IIS和消息队列(MSMQ) 进入控制面板,程序和功能 b) ...
- Try,Catch,Finally三块中如果有Return是怎么个运行顺序
今天看一个Java SSH的面试题,题目大概意思是:try.catch中存在return语句,还会执行finally块吗?如果执行,是return先执行还是finally先执行?如果有多个return ...
- 使用Dotfuscator加密混淆程序以及如何脱壳反编译
混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL. 这里随便创建了一个C#的命令行控制台程序.程序很简单,对当前的时间进行了AE ...
- 动手写IL到Lua的翻译器——准备
文章里的代码粘过来的时候格式有点问题,原因是一开始文章是在订阅号上写的(gamedev101,文末有二维码),不知道为啥贴过来就没了格式,还要手动删行号,就没搞了. 介绍下问题背景: 小说君正在参与的 ...
- 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...
随机推荐
- 理解maven项目的pom.xml文件中,<scope>标签的作用——作用域以及依赖传递
问题介绍: 在maven项目中,最关键的就是pom.xml这个文件,这个文件是用来导入maven项目依赖的jar包以及一些插件等. 在这个文件中导入jar包使用的标签是<dependency&g ...
- ajax如何向后台传递数组,在后台该如何接收的问题(项目积累)
一.后台如何接收从前台接收的数组: 使用request.getParameterValues(String xxx); <input type="text" name=&qu ...
- 导出delphi编写的ios程序在xcode下的日志
- Linux 防火墙iptables命令详解
[转:原文链接] iptables -Fiptables -Xiptables -F -t mangleiptables -t mangle -Xiptables -F -t natiptables ...
- Android实现自带横线的EditText
(一)问题 怎样实现带有横栏的EditText(像记事本的编辑界面那样)? (二)初步思路 1.通过修改EditText背景来实现(系统背景是一个框形图片,内部透明,替换为一个带有横栏的图片即可) 2 ...
- 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构
本篇承接上篇内容,如果你不小心点击进来,建议重新从第一篇开始完整阅读. 构建NetCore应用框架之实战篇索引 一.BitAdminCore框架简介 从前篇论述我们知道,我们接下来将要去做一个管理系统 ...
- 浏览器对HTTP请求的编码行为
浏览器对请求的URL编码行为 浏览器会对请求的URL中非ASCII码字符进行编码.这里不是指对整个URL进行编码,而是仅仅对非ASCII码字符部分进行编码,详情请看下面的实验记录. 实验一:在URL参 ...
- Android学习之ViewPager
1.定义 ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view.其中,android.support.v4是谷歌公司为了解决当前版本碎片化的问题,从而提供的一 ...
- 如何使用socket进行java网络编程(一)
笔者进来遇到一个项目,一家公司的系统需要在完成自身业务逻辑的同时,接入到某银行的核心系统(这里准确说应该是前置机)进行一系列的账务处理,然后再将账务处理结果返回给该公司系统. 网络通信采用TCP协议. ...
- S11 day 93 RestFramework 之 序列化
1. 表建模 from django.db import models # Create your models here. #文章表 class Article(models.Model): tit ...