在Virual Studio2022中,我有一个C#.NET4.8项目,它引用了一个我没有源代码的DLL.

我想通过反编译的DLL代码进行调试.该DLL在同一目录中包含一个相应的.pdb文件.

Here my Debug settings: enter image description here

使用F12,我可以查看反编译的代码.但是,当我开始调试(F5)并try 介入时 (F11)进入DLL后,Visual Studio接缝调试不同版本的代码.例如,Visual Studio在注释(下面的屏幕截图)中移动调试光标...

enter image description here

我的设置中有什么遗漏的地方吗?或者.pdb已经过时了?如何设置Visual Studio以通过DLL进行反编译和正确调试?

推荐答案

我可以重现你的情况:

enter image description here

Reasons for this situation: the decompiled code does not match the original code, or the pdb file does not match the source file version.

机制:

因为对于C#,PDB主要记录行号等信息(如果它是CPP,则在PDB中会有源代码信息,这是不同的),并且因为您一侧的源文件与它应该是不同的,所以当您按f11时,它将"步入"一个您"认为"完全错误的位置,但实际上它已经转到了正确的位置(我的意思是,如果您按f11,如果源文件匹配,它真的应该转到该行).

解决问题的关键是确保三个文件的一致性:源文件、DLL和PDB.

您可以使用像dotpeek这样的工具将C#DLL文件反编译成一个项目(您可以使用该工具将DLL导出为一个全新的项目/解决方案),然后您就可以构建这个新项目了.在这种情况下,您可以确保这个新项目中的源文件、DLL和PDB是一致的.让您的测试项目引用这个反编译项目中的DLL,这样您就不会遇到问题.

应该指出的是,the decompilation operation cannot guarantee that the decompilation code is 100% the same as the source code. It is inevitable that the code obtained in this way will be somewhat different from the source code.

顺便说一句,正如Hans提到的,有一个名为‘需要与原始版本完全匹配的源文件’的功能:

enter image description here

这是官方文件:

Require source files that exactly match the original version

您需要打开此功能(这是我这边的默认打开设置.)

Csharp相关问答推荐

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

CsWin32如何创建PWSTR的实例,例如GetWindowText

以自动方式注销Azure身份应用程序

在. net毛伊岛窗口的深度链接已经创建""

EF Core在请求列表时忽略列,但在按ID获取时包含

EF Core. Income和. AsNoTracking正确用法

限制特定REST API不被访问,但部署代码

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

MS Graph v5.42.0:在寻呼消息时更改页面大小

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

Rx.Net窗口内部可观测数据提前完成

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

如何防止Visual Studio断点以红色突出显示到整行?

GODOT 4向C#中的字符串参数发送信号以等待

等待一个等待函数

WPF DataGrid文件名列,允许直接输入文本或通过对话框按键浏览

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

try 访问字典中的模拟对象时引发KeyNotFoundException

为什么我的UserControl没有加载到我的主窗口中?