如何在没有第三方.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.hqwc.cn/news/115479.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP8266 WiFi物联网智能插座—电能计量

目录 1、芯片功能 2、性能指标 3、寄存器说明 4、UART通信协议 4.1、写操作帧格式和时序 4.2、读操作帧格式和时序 4.3、读取全电参数数据包 4.4、配置波特率 4.5、UART保护机制 5、功能说明 5.1、电流电压瞬态波形计量 5.2、有功功率 5.3、有功功率防潜动 5.4、电能计量 5.5、…

摩尔信使MThings实用功能盘点

“冗长的用户手册”与“精简的交互设计”之间势必产生一条信息鸿沟,现在就来盘点一下摩尔信使MThings有哪些隐蔽而实用的功能。 01 数据配置类 一键刷新 功能:快速读取所有位数据、寄存器数据的当前数值。 操作:双击“数值”列表头。 一键…

基于微信小程序的公司后勤服务(设备)系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明员工微信端的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍&#x…

【C++】搜索二叉树底层实现

目录 一,概念 二,实现分析 1. 插入 (1.)非递归版本 (2.)递归版本 2. 打印搜索二叉树 3.查找函数 (1.)非递归版本 (2.)递归版本 4. 删除函数&#x…

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…

反编译之崩溃定位

反编译之崩溃定位 1.背景问题定位1.首先我们需要找崩溃所在的类和方法2.寻找崩溃的代码行数2.1借用反编译工具jadx查看反编译后的内容 1.背景 线上出了个崩溃(量挺大😭),但是apk是被混淆过的,一时摸不着头脑。崩溃信息如下: 主要…

Leetcode198. 打家劫舍

https://leetcode.cn/problems/house-robber/description/ 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入&…

《深度学习工业缺陷检测》专栏介绍 CSDN独家改进实战

💡💡💡深度学习工业缺陷检测 1)提供工业小缺陷检测性能提升方案,满足部署条件; 2)针对缺陷样品少等难点,引入无监督检测; 3)深度学习 C、C#部署方案&#…

AP5193 DC-DC恒流转换器 消防应急 灯汽车灯 应急日光灯太阳能灯驱动IC

AP5193是一款PWM工作模式,高效率、外围简单、 内置功率MOS管,适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光,线性调光 脚有效电压范围0.55-2.6V. AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c…

基于SpringBoot的网上超市系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户功能实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计…

flex布局与float布局

float布局 俩栏 三栏 flex布局

画电路板通用知识

快捷键 快捷键 功能 shift+鼠标滚轮左右移动Ctrl+鼠标滚轮放大缩小 (Alt+) 鼠标滚轮上下移动滚轮按下鼠标滚轮可任意方向拖动图纸(可以一直保持按下状态或者按一下松开) CTRL+鼠标左键拖动复制该元件CTRL+E编辑选中元件的属性CTRL+鼠标左键 元叠选izoom in,聚焦光标所…