当前位置: 首页 > news >正文

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好,我是沙漠尽头的狼。

本方首发于Dotnet9,介绍使用dnSpy调试第三方.NET库源码,行文目录:

  • 安装dnSpy
  • 编写示例程序
  • 调试示例程序
  • 调试.NET库原生方法
  • 总结

1. 安装dnSpy

dnSpy是一款功能强大的.NET程序反编译工具,可以对.NET程序进行反编译,代替库文档的功能,代码丢失或者损坏可直接恢复,所以能在完全没有源码的情况下即时调试程序,甚至还能修改程序!

Github有二进制可执行程序下载地址,也有源码可以自行编译,本文使用前者,Github地址是:https://github.com/dnSpy/dnSpy

2. 编写示例程序

示例为一个桌面程序,输入数字,右侧回显输入的数字是奇数还是偶数:

示例代码比较简单,界面绑定和ViewModel关系截图看完所有:

奇偶判断由类TestToolTellMeOddEven方法返回,再回看回显,咦,0是奇数?1是偶数?

TestTool类是其他库定义,我假装你没有源码哈,虽然你有:

类具体定义如下:

namespace TestDll;public class TestTool
{public string TellMeOddEven(int number){if (number % 2 == 1){return $"{number}是偶数";}return $"{number}是奇数";}
}

3. 调试示例程序

打开dnSpy,将主程序引用的TestDll拖入:

可以看到反编译后的代码:

反编译出来的方法定义会和第三方源码可能不同,以下是一些可能导致不同反编译结果的因素:

  1. 编译器优化:不同版本的编译器可能会对代码进行不同的优化,例如使用不同的算法、数据结构或者代码重排等。这些优化可能会导致反编译出来的代码结构和顺序不同,本文示例使用 .NET 8开发,.NET Framework编译的库可能反编译出来与源码几乎一致。

  2. 反编译工具更新:dnSpy本身也会不断更新,以适应新的.NET版本和编译器特性。这些更新可能会改变反编译算法和策略,从而导致不同版本的dnSpy反编译结果不一致。

代码简单,对比源码和反编译的代码查看,对整型入参除2取余,如果等于1判断为偶数,否则为奇数,当然这是错的,假如代码逻辑复杂,可以用dnSpy调试。

运行测试程序,并在dnSpy中给方法打断点,在调试菜单附加测试程序,就和VS中操作类似:

4. 调试.NET库方法

上面调试示例程序的方法可用于其他第三方.NET库,那么.NET自身库方法呢?

方法类似,找到.NET库对应类、对应方法,运行目标程序,然后打断点。.NET库方法这样找:点击【文件】》【从GAC打开】=》搜索目标库,双击库,再查找目标方法,后面调试步骤就是一样了:

5. 总结

  • 技术交流加群请添加站长微信号:dotnet9com
  • 文中示例代码:MultiVersionLibrary

dnSpy很强大的,还能直接监视第三方代码的变量、修改值等,就和你使用VS开发自己的程序一样,了解更多用法还请查看文章开头给的链接https://github.com/dnSpy/dnSpy, 这篇大佬的文章也不错,建议看看:《神器如 dnSpy,无需源码也能修改 .NET 程序》。

对了,示例程序中奇偶数判断不对,我又没代码我想纠正怎么办?

解决这个问题,上面大佬的文章您可以拜读了,下一篇站长继续讲解第三方库拦截,能实现不修改第三方库达到修改方法逻辑和返回结果的效果,可以提前预习快学会这个技能-.NET API拦截技法,当然下一篇会有新知识点:非公有类非公有方法拦截技法。

以原仓库两张dnSpy调试第三方库的动图结束本文:

http://www.lryc.cn/news/172950.html

相关文章:

  • 仿互站资源商城平台系统源码多款应用模版
  • 华为云云耀云服务器L实例评测 | L实例性能测试实践
  • VR赋能红色教育,让爱国主义精神永放光彩
  • 计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-图像去噪 [北邮鲁鹏]
  • 三行代码实现图像画质修复,图片清晰度修复,清晰度提升python
  • 企业电子招投标采购系统源码之电子招投标的组成
  • 【MySQL】 MySQL的增删改查(进阶)--贰
  • 第七章 查找
  • openfeign返回消息报错.UnknownContentTypeException
  • [Linux入门]---Linux项目自动化构建工具-make/Makefile
  • [Python进阶] 程序打包之Pyinstaller参数介绍
  • Python中如何判断列表中的元素,是否在一段文本中??
  • spark Structured报错解决
  • Matter 协议系列:发现
  • Oracle 12c Docker镜像配置SSL
  • 版本控制系统git:一文了解git,以及它在生活中的应用,网站维护git代码,图导,自动化部署代码
  • uqrcode+uni-app 微信小程序生成二维码
  • 从零开始的 MyBatis 拦截器之旅:实战经验分享
  • 网络编程day05(IO多路复用)
  • 人声分离网站,帮你快速提取视频中的人声和背景音乐
  • 计算机网络常见问题
  • 上PICO,沉浸式观看亚运直播,参与跨国界游戏竞技
  • 无重复字符的最长子串 - 力扣(LeetCode)
  • 企业行政许可的种类有哪些?
  • Flink--4、DateStream API(执行环境、源算子、基本转换算子)
  • #循循渐进学51单片机#指针基础与1602液晶的初步认识#not.11
  • Lua学习笔记:探究package
  • 【面试经典150 | 双指针】三数之和
  • 现代卷积网络实战系列3:PyTorch从零构建AlexNet训练MNIST数据集
  • Django系列:Django应用(app)的创建与配置