.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?
什么是Dll?
DLL 是一个包含可由多个程序同时使用的代码和数据的库。
例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该Dll中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。
通俗来讲,一个项目由多个模块组成。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载,而更新的话,就只需替换掉当前的DLL就行了.
如何制作Dll?
在以.net的开发为例,在当前编译环境下,只需要对当前想要制作成dll的项目右键重新生成下,然后在该项目对应的文件夹下面找到debug文件夹,里面就会有一个与当前项目名称一样的后缀为dll的文件。
Dll怎么用?
首先先在项目中引用该dll,然后在用到dll的地方using一下,即可调用其中的类与方法。因为是dll,所以你F12进去一般都是这样的:

可以看到该类既不是抽象类也没有继承任何接口和类,但是方法体却没有实现,而最上面 有写xx程序集之类。
你可以通过vs的对象浏览器看看里面都是啥结构,但是你是看不到方法里面的代码的,也无法调试。
怎么查看dll的代码?
你想了解这些dll中的代码实现,但是你看不到。但是,你想到的,前人早想到了。那么我们换个说法,之所以你看不到被编译好的dll中的代码,那是因为vs编译器本身不带这个功能。
那么,我们找一款工具来辅助我们来看看这个dll中的代码。
这个实现过程,叫 反编译。
那么,自然,我们要用的就是 反编译软件。
当下知名的反编译软件有 Il spy,.NET Reflector
这两个软件我比较喜欢用IL SPY,因为网上有中文版的。
放图:

如果你想查看特定的dll的话,可以点击文件选项卡,然后点击打开,然后找到dll路径就可以了(.NET Reflector也一样)。
工具很方便,有很多功能,具体教程,大家自行百度。
怎么去在vs实际开发项目中调试dll中的代码?
如果光是看看源码可不够,还想在项目中实际调试怎么办?那么我告诉你,只有一个工具可以满足。
那就是 .NET Reflector的vs插件。
.NET Reflector是个反编译的软件,但如果你想即时调试dll的代码的话,还需再用其vs的插件。
.NET Reflector和.NET Reflector的vs插件是两个概念,不懂的话请自行百度 什么是vs插件。
接下来我教大家怎样安装并使用这个插件。
首先,点击工具,点击扩展和更新

然后点击 联机,并在最右侧的搜索框中 搜索 Reflector

最后,选中第一个,点击安装即可。
目前最新版本9.2
安装完成,vs中就会多了个选项卡。

给大家介绍下,.NET Reflector Object Browser是 .net反射对象浏览器,这个是用来控制.net反射对象浏览器 显示及隐藏的。
.net反射对象浏览器长这样:

这个.net反射对象浏览器 你可以浏览当前.net框架默认的程序集, 你可以一层一层点开,最终点到你想要看的类里面。

但是,这样做只能看到源码,并不能调试。
还需要在该dll右键,点击选中Enable Debugging,意思就是将该dll启动到可调试的状态。当你点击该选项的时候,这个插件会把这个dll的代码给转成本地的文件,.NET Reflector首先会尝试定位本机上的PDB文件,如果没有则会自己创建PDB文件,这才能进行调试。

点击后会出现一个界面,这个界面就是当前状态改变的过程。

成功后是这样的:

直接点Done关闭掉就可以。
接下来我们就可以打断点调试了!

选中断点,然后按照你喜欢的方式去调试!F5或者附加进程都可以。
为什么有的代码无法调试?
有的时候,你即便打了断点,可发现怎么也调试不进去。
原因有很多可能,包括条件编译、编译器优化结果、目标体系结构等不同,总之,你不能调试。
接下来我要放一张.Net Reflector反编译的代码,和一张IL SPY反编译的代码。


可以发现,同样的dll,两个软件有着不同的反编译结果。
所以,要对编译与反编译有个最基础的概念,并不是很神奇的就能把真正的源码给你给反编译出来,而是对编译的算法进行推测,然后逆推的结果再进行软件的一些处理来达到100%接近源码的这样一个程度。
有反编译,那么就有防破解加密。
有些代码,经过加壳混淆,反编译出来的东西很尴尬。
那么,关于对dll加密这方面的东西,大家如果有兴趣,可以自行百度了解下。
而关于反编译,除了il spy,.Net Reflector 还有JetBrains dotPeek、Telerik JustDecompile等等,区别就是算法不同反编译出来的代码不同、收费、功能等
我刚演示的.Net Reflector,还有很多功能,这里只做最简单的入门教程,有兴趣请自行了解, 这是人家的网站,http://www.red-gate.com/products/dotnet-development/reflector/

作者:小曾
出处:http://www.cnblogs.com/1996V/p/7396913.html 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言.Net交流群, QQ群:166843154 欲望与挣扎
.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?的更多相关文章
- 如何在C#中调试LINQ查询
原文:How to Debug LINQ queries in C# 作者:Michael Shpilt 译文:如何在C#中调试LINQ查询 译者:Lamond Lu 在C#中我最喜欢的特性就是LIN ...
- 如何在VC++ 中调试MEX文件
MEX文件对应的是将C/C++文件语言的编写之后 得到的相关文件加载到Matlab中运行的一种方式, 现对于Matlab 中的某些程序运行效率而言, C/C++ 代码某些算法的领域上面执行效率很高,若 ...
- linux系统下如何在vscode中调试C++代码
本篇博客以一个简单的hello world程序,介绍在vscode中调试C++代码的配置过程. 1. 安装编译器 vscode是一个轻量的代码编辑器,并不具备代码编译功能,代码编译需要交给编译器完成. ...
- 如何在eclipse中配置反编译工具JadClipse
Q:为什么有必要在开发环境中配置反编译工具呢? A: 当运行引用了第三方jar包项目时,突然报出了jar包中的某个类的某一行出现异常.我们想看一下这个class文件的代码时,经常出现了如下图所示的场 ...
- 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码
前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...
- 如何在arcmap中调试addin或者插件
1. 首先,在arcmap中,依次点击“自定义”->"加载项管理器",加载dll或者tlb文件 2. 其次,在vs中,依次点击“工具”->“附加到进程",在对 ...
- 如何在wp8 中调试cocos2dx c++ 代码
有的时候在win32上运行良好的cocos2dx程序移植到wp8的时候就出了问题,我们想把断点放到c++代码中,需要设置一下VS 2012 右击项目属性 把ui任务 设置为仅限本机 即可.
- 如何在IDEA中调试 Jar文件
原创文章,转载请注明出处:http://www.cnblogs.com/acm-bingzi/p/6668333.html 问题: 一般情况下,可以打成Jar包的项目,它的源码运行Applicat ...
- 如何在idea中调试spring bean
步骤 在 Run/Debug Confihuration 中,增加 Application -> local,除去其余配置外,在 Program arguments 一栏添加以下字段:javac ...
随机推荐
- mysql中exists、not exists的用法
exists 关键字是判断是否存在的,存在则返回true,不存在则返回false, not exists则是不存在时返回true,存在返回false: 1. 最常用的if not exists用法: ...
- Unity3D Image 组件附入图片问题
作为新手经常会看到有个Image的组件 代码中理所当然的public 发现图片并不能附入其中, 解决办法直接 public Sprite 就可以了
- STL—vector
前面介绍了STL对象的构造与析构以及内存的配置与释放,那具体的容器是怎么应用STL的空间配置器的呢?这篇先介绍STL的容器vector. vector的数据成员 vector只有4个数据成员:3个迭代 ...
- python中的模块,以及包的导入的总结
模块导入的方式: 模块的概念:一个.py文件就称为一个模块 导入模块中函数的方式: 方式一:import 模块名 使用时:模块名.函数名() 方式二 :from 模块名 import 函数名 使用 ...
- (转)java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- (转)Windows7下命令行使用MySQL
1 安装 我在Win7下安装的MySQL版本是mysql-5.0.22-win32 1.在Win7环境下安装MySQL,关于安装方法可以参考文章: Win7系统安装MySQL5.5.21图解教程.wi ...
- 线上故障排查——drools规则引擎使用不当导致oom
事件回溯 1.7月26日上午11:34,告警邮件提示:tomcat内存使用率连续多次超过90%: 2.开发人员介入排查问题,11:40定位到存在oom问题,申请运维拉取线上tomcat 内存快照dum ...
- 【CSS】less 学习小结
1. less 使用 less 可直接使用浏览器解析 or 使用node 的grunt/gulp 解析成传统css . 推荐开发环境直接使用less 文件调试, 生产环境部署解析好的css 2. l ...
- javaBean与Servlet学习
1.JavaBean JavaBean将java代码单独封装成了一个处理某种业务逻辑的类,可以降低HTML与Java代码的耦合度,并且简化JSP页面,提高Java程序代码的重用性及灵活性. JavaB ...
- 设计模式-策略模式Strategy以及消灭if else
概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...