.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

什么是Dll?

DLL 是一个包含可由多个程序同时使用的代码和数据的库。
例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该Dll中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。
通俗来讲,一个项目由多个模块组成。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载,而更新的话,就只需替换掉当前的DLL就行了.

如何制作Dll?

在以.net的开发为例,在当前编译环境下,只需要对当前想要制作成dll的项目右键重新生成下,然后在该项目对应的文件夹下面找到debug文件夹,里面就会有一个与当前项目名称一样的后缀为dll的文件。
Dll怎么用?
首先先在项目中引用该dll,然后在用到dll的地方using一下,即可调用其中的类与方法。因为是dll,所以你F12进去一般都是这样的:

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

可以看到该类既不是抽象类也没有继承任何接口和类,但是方法体却没有实现,而最上面 有写xx程序集之类。
你可以通过vs的对象浏览器看看里面都是啥结构,但是你是看不到方法里面的代码的,也无法调试。

怎么查看dll的代码?

你想了解这些dll中的代码实现,但是你看不到。但是,你想到的,前人早想到了。那么我们换个说法,之所以你看不到被编译好的dll中的代码,那是因为vs编译器本身不带这个功能。
那么,我们找一款工具来辅助我们来看看这个dll中的代码。
这个实现过程,叫 反编译。
那么,自然,我们要用的就是 反编译软件。
当下知名的反编译软件有 Il spy,.NET Reflector
这两个软件我比较喜欢用IL SPY,因为网上有中文版的。
放图:

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

如果你想查看特定的dll的话,可以点击文件选项卡,然后点击打开,然后找到dll路径就可以了(.NET Reflector也一样)。
工具很方便,有很多功能,具体教程,大家自行百度。

怎么去在vs实际开发项目中调试dll中的代码?

如果光是看看源码可不够,还想在项目中实际调试怎么办?那么我告诉你,只有一个工具可以满足。
那就是 .NET Reflector的vs插件。
.NET Reflector是个反编译的软件,但如果你想即时调试dll的代码的话,还需再用其vs的插件。
.NET Reflector和.NET Reflector的vs插件是两个概念,不懂的话请自行百度 什么是vs插件。
接下来我教大家怎样安装并使用这个插件。
首先,点击工具,点击扩展和更新

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

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

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

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

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

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

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

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

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

但是,这样做只能看到源码,并不能调试。

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

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

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

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

成功后是这样的:

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

直接点Done关闭掉就可以。

接下来我们就可以打断点调试了!

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

选中断点,然后按照你喜欢的方式去调试!F5或者附加进程都可以。

为什么有的代码无法调试?

有的时候,你即便打了断点,可发现怎么也调试不进去。

原因有很多可能,包括条件编译、编译器优化结果、目标体系结构等不同,总之,你不能调试

接下来我要放一张.Net Reflector反编译的代码,和一张IL SPY反编译的代码。

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

可以发现,同样的dll,两个软件有着不同的反编译结果。

所以,要对编译与反编译有个最基础的概念,并不是很神奇的就能把真正的源码给你给反编译出来,而是对编译的算法进行推测,然后逆推的结果再进行软件的一些处理来达到100%接近源码的这样一个程度。

有反编译,那么就有防破解加密。

有些代码,经过加壳混淆,反编译出来的东西很尴尬。

那么,关于对dll加密这方面的东西,大家如果有兴趣,可以自行百度了解下。

而关于反编译,除了il spy,.Net Reflector 还有JetBrains dotPeek、Telerik JustDecompile等等,区别就是算法不同反编译出来的代码不同、收费、功能等

我刚演示的.Net Reflector,还有很多功能,这里只做最简单的入门教程,有兴趣请自行了解, 这是人家的网站,http://www.red-gate.com/products/dotnet-development/reflector/

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

作者:小曾
出处:http://www.cnblogs.com/1996V/p/7396913.html 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言.Net交流群, QQ群:166843154 欲望与挣扎 
上一篇:HDU 5389 Zero Escape


下一篇:Java中抽象类概述