こんにちは、私は砂漠の果ての狼です。
本方首发于Dotnet9,介绍使用dnSpy调试第三方.NET库源码,行文目录:
- dnSpyのインストール
- サンプルプログラムの作成
- サンプルプログラムのデバッグ
- デバッグ. NETライブラリのネイティブメソッド{{でばっぐ. NETらいぶらりのネイティブめそっど}}
- まとめまとめまとめ
1. dnSpyのインストール
dnSpyは強力な. NETプログラム逆コンパイルツールであり、. NETプログラムを逆コンパイルし、ライブラリドキュメントの機能を置き換え、コードの損失や損傷を直接回復することができるので、ソースコードなしで即座にプログラムをデバッグし、さらにはプログラムを変更することができます!
GitHub有二进行可能プログラム下载アドレス,也有ソースコード可以自己コンパイル,本文使用前者,GitHubアドレス是:https//github.com/dnSpy/dnSpy

2. サンプルプログラムの作成
例として、数値を入力し、右側が奇数か偶数かをエコーするデスクトッププログラムを考えます。

サンプルコードはシンプルで、インターフェイスバインディングとViewModel関係のスクリーンショットはすべて表示されます:

奇偶判断由类TestTool的TellMeOddEven方法返回,再回看回显,咦,0是奇数?1是偶数?
TestTool类是其他库定义,我假装你没有源码哈,虽然你有:

クラスの定義は以下の通りです。
namespace TestDll;
public class TestTool
{
public string TellMeOddEven(int number)
{
if (number % 2 == 1)
{
return $"{number}是偶数";
}
return $"{number}是奇数";
}
}
3. サンプルプログラムのデバッグ
打开dnSpy,将主程序引用的TestDll拖入:

逆コンパイルされたコードを確認できます:

逆コンパイルされたメソッド定義はサードパーティのソースコードとは異なる可能性があります。逆コンパイル結果が異なる可能性のある要因をいくつか紹介します。
コンパイラの最適化:コンパイラのバージョンによって、異なるアルゴリズム、データ構造、コードの再配置など、コードの最適化が異なる場合があります。これらの最適化により、逆コンパイルされたコードの構造や順序が異なる可能性があります。この例では. NET 8で開発されており、. NET Frameworkでコンパイルされたライブラリはソースコードとほぼ同じに逆コンパイルされます。
逆コンパイルツールのアップデート:dnSpy自体は、新しい. NETバージョンとコンパイラ機能に対応するために継続的に更新されます。これらの更新により逆コンパイルアルゴリズムとポリシーが変更され、dnSpyの逆コンパイル結果が異なる場合があります。
コードはシンプルで、ソースコードと逆コンパイルされたコードを比較して、整数引数2を除算して、偶数として1に等しい場合、それ以外の場合は奇数ですが、もちろん、これは間違っています。コードロジックが複雑な場合は、dnSpyデバッグを使用することができます。
テストプログラムを実行し、dnSpyでメソッドブレークポイントを与え、デバッグメニューにテストプログラムを追加すると、VSと同様に動作します。

4. デバッグ. NETライブラリメソッド{{でばっぐ. NETらいぶらりめそっど}}
サンプルプログラムをデバッグする上記のメソッドは、他のサードパーティ製の. NETライブラリでも使用できますが、. NET自体のライブラリメソッドはどうですか?
メソッドは似ています。. NETライブラリ対応クラス、対応メソッドを見つけて、ターゲットプログラムを実行してから、ポイントを中断します。NETライブラリメソッドは次のように検索します:[ファイル]>[GACから開く]=をクリックしてターゲットライブラリを検索し、ライブラリをダブルクリックしてターゲットメソッドを検索し、デバッグ手順は同じです:

5. まとめまとめまとめ
- テクニカルコミュニケーションプラスグループウェブマスターマイクロ信号を追加してください:codewf
- 文中示例代码:MultiVersionLibrary
dnSpy很强大的,还能直接监视第三方代码的变量、修改值等,就和你使用VS开发自己的程序一样,了解更多用法还请查看文章开头给的链接https://github.com/dnSpy/dnSpy, 这篇大佬的文章也不错,建议看看:《神器如 dnSpy,无需源码也能修改 .NET 程序》。
** はい、サンプルプログラムのパリティが正しくない、コードがない、修正したいですか?**
解决这个问题,上面大佬的文章您可以拜读了,下一篇站长继续讲解第三方库拦截,能实现不修改第三方库达到修改方法逻辑和返回结果的效果,可以提前预习快学会这个技能-.NET API拦截技法,当然下一篇会有新知识点:非公有类非公有方法拦截技法。
この記事は、元のリポジトリの2つのdnSpyデバッグサードパーティライブラリの動的図で終了します。

