CSharp Decompilerとは?無料で使えるC#逆コンパイラの選び方と使い方
CSharp Decompilerは、C#で開発されたDLLやEXEを解析し、人が読めるC#コードに変換するためのツールです。ソースコードを失った自作アプリの調査、外部ライブラリの動作確認、デバッグ、学習などに役立ちます。一方で、元のソースコードを完全に復元できるわけではなく、著作権やライセンスにも注意が必要です。
はじめに
「csharp decompiler」と検索している方の多くは、手元にあるDLLやEXEの中身を確認したい、ソースコードのないC#アプリを調査したいと考えているのではないでしょうか。
C#で作られた一般的な.NETアプリケーションには、CILまたはILと呼ばれる中間言語と、クラス名やメソッド名などのメタデータが含まれています。そのため、ネイティブコードだけで構成されたプログラムと比べると、比較的読みやすいC#コードへ逆変換できます。
ただし、逆コンパイルされたコードは、開発者が最初に記述したソースコードそのものではありません。本記事では、CSharp Decompilerの仕組み、無料ツールの選び方、基本的な使い方、利用時の注意点を初心者にも分かりやすく解説します。
1. CSharp Decompilerとは?C#逆コンパイラの基本
1-1. CSharp Decompilerの意味と役割
CSharp Decompilerとは、コンパイル済みの.NETアセンブリを解析し、C#形式のコードへ変換して表示するソフトウェアです。日本語では「C#逆コンパイラ」「.NETデコンパイラ」などと呼ばれます。
主に解析対象となるのは、次のようなファイルです。
.dll形式のクラスライブラリ.exe形式の.NETアプリケーション.winmd形式のWindowsメタデータ.nupkg形式のNuGetパッケージUnityアプリに含まれるマネージドDLL
CSharp Decompilerを使うと、アセンブリに含まれる名前空間、クラス、インターフェース、メソッド、プロパティ、フィールドなどを階層的に確認できます。
1-2. コンパイルと逆コンパイルの違い
コンパイルは、人が記述したC#コードをコンピューターが実行できる形式へ変換する処理です。一般的な.NETアプリでは、C#コンパイラによってソースコードがILとメタデータを含むアセンブリへ変換されます。
逆コンパイルは、その反対方向の処理です。DLLやEXEに含まれるILとメタデータを解析し、人が理解しやすいC#コードを再構成します。
処理の流れを簡単に表すと、次のようになります。
C#ソースコード
↓ コンパイル
IL・メタデータを含むDLL/EXE
↓ 逆コンパイル
再構成されたC#コード
逆コンパイルは単純に処理を巻き戻すものではありません。コンパイル時に失われた情報を推測しながら、意味が近いC#構文へ組み立て直す処理です。
1-3. C#のDLL・EXEから何が復元できるのか
一般的な.NETアセンブリからは、次のような情報を確認できます。
名前空間やクラスの構成
メソッドとプロパティの処理
public、privateなどのアクセス修飾子
継承関係や実装インターフェース
属性やジェネリック型の情報
参照しているアセンブリ
文字列リテラルや定数
埋め込まれたリソース
アセンブリのメタデータ
元になったILコード
デバッグ情報を含むPDBファイルや、Source Linkで公開されたソースが存在する場合は、逆コンパイル結果ではなく、元のソースファイルを参照できることもあります。dotPeekはPDBやシンボルサーバーから元のソースを取得でき、Visual StudioもSource Linkに対応したライブラリのソースへ移動できます。JetBrains+1
1-4. 逆コンパイルで元のソースコードを完全復元できない理由
コンパイル時には、プログラムの実行に必要のない情報が削除または変換されます。代表的なものは次のとおりです。
コメント
空白や改行などの書式
元のファイル構成
一部のローカル変数名
開発者が選んだ構文表現
条件付きコンパイル前のコード
使用されなかったコード
最適化によって統合・削除された処理
例えば、元のコードが複雑なLINQ式で記述されていても、逆コンパイル結果では別の形式になることがあります。async、await、イテレーター、ラムダ式なども、コンパイル時にステートマシンや生成クラスへ変換されるため、完全に同じ記述へ戻るとは限りません。
Microsoftも、逆コンパイル結果は元のソースコードの代替ではなく、プログラムの実行方法を理解するために使うことを推奨しています。Microsoft Learn
2. csharp decompilerを検索するユーザーの主な目的
2-1. DLLやEXEの中身を確認したい
DLLを受け取ったものの、どのようなクラスやメソッドが含まれているのか分からない場合に、CSharp Decompilerが役立ちます。
APIの公開範囲、引数、戻り値、依存ライブラリなどを調べるだけであれば、コード全体を詳しく読む必要はありません。アセンブリツリーを展開し、目的の名前空間や型を選択することで概要を把握できます。
ただし、すべてのEXEをC#コードへ変換できるわけではありません。C#やVisual Basic .NETなどで作られたマネージドアセンブリが主な対象です。
2-2. ソースコードを失ったC#アプリを解析したい
過去に自社や自分で開発したアプリケーションのソースコードを失い、DLLやEXEだけが残っている場合にも逆コンパイラを利用できます。
クラス構成や主要な処理を調査し、新しいプロジェクトを作り直すための参考情報を得られます。ただし、逆コンパイル結果をそのままビルドして元のアプリを完全再現できるとは限りません。
設定ファイル、画像、データベース、外部DLL、ネイティブライブラリ、ビルド条件など、アセンブリ以外の構成要素も必要です。
2-3. 外部ライブラリの動作を調べたい
外部DLLやNuGetパッケージを使用していると、ドキュメントだけでは内部動作を理解できない場合があります。
CSharp Decompilerを利用すれば、公開APIが内部でどのメソッドを呼び出しているか、どの条件で例外が発生するか、引数がどのように処理されるかを確認できます。
ただし、内部実装は将来のバージョンで変更される可能性があります。逆コンパイルで確認した非公開の実装に依存してプログラムを作ると、ライブラリの更新時に動作しなくなることがあります。
2-4. Unityや.NETアプリの挙動を確認したい
UnityでMonoまたは互換性のあるマネージド環境を使用しているアプリでは、Assembly-CSharp.dllなどにゲーム固有のC#コードが格納されていることがあります。
ILSpyやdnSpy系ツールを利用すると、MonoBehaviourを継承したクラス、イベント処理、状態管理などを確認できます。dnSpyには.NETやUnityアセンブリのデバッグ・編集機能があり、その後継プロジェクトとしてdnSpyExが開発されています。GitHub+1
一方、IL2CPPでビルドされたUnityアプリは、C#のILがネイティブコードへ変換されています。通常のC#逆コンパイラだけでは、元に近いC#コードを直接表示できません。
2-5. デバッグ・学習・セキュリティ調査に活用したい
逆コンパイルは、次のような目的でも利用されます。
例外が発生する条件の調査
外部ライブラリ内部へのステップ実行
C#コンパイラが生成するILの学習
フレームワーク内部の処理確認
脆弱性や不審な処理の調査
マルウェアの静的解析
依存関係や使用APIの確認
解析対象を実行せずにコードを読む静的解析は、安全性を判断する最初の手段になります。ただし、コードを開くだけで安全性を完全に確認できるわけではありません。
3. 無料で使える代表的なC#逆コンパイラ
3-1. ILSpy:オープンソースで定番の.NETデコンパイラ
ILSpyは、オープンソースで提供されている代表的な.NETアセンブリブラウザー兼デコンパイラです。MITライセンスで公開されており、C#への逆コンパイル、プロジェクト単位のエクスポート、型やメソッドの検索、メタデータの表示などに対応しています。
現在のILSpyにはWindows、Linux、macOSで動作するクロスプラットフォーム版があり、Visual StudioやVS Code向けの拡張機能、コマンドラインツールも提供されています。GitHub
主な特徴は次のとおりです。
無料かつオープンソース
C#コードへの逆コンパイル
プロジェクト全体のエクスポート
クラス、メソッド、プロパティの検索
メタデータやILの確認
ReadyToRun形式への対応
Visual Studio、VS Codeとの連携
コマンドラインでの処理
初めてCSharp Decompilerを使う場合や、DLLの構造を手早く確認したい場合に有力な選択肢です。
ILSpyを入手するときは、公式GitHubリポジトリのリリースページなど、プロジェクトが案内している正規の配布元を利用しましょう。ILSpy公式リポジトリも、非公式サイトではなくGitHub Releasesからダウンロードするよう注意を促しています。GitHub
3-2. dotPeek:JetBrains製の無料C#デコンパイラ
dotPeekは、ReSharperやRiderを開発するJetBrainsが提供している無料の.NETデコンパイラです。DLL、EXE、WINMD、NuGetパッケージなどを開き、C#コードまたはILコードとして表示できます。JetBrains+1
主な特徴は次のとおりです。
無料で利用できる
ReSharperに近いコードナビゲーション
DLL、EXE、NuGetパッケージの解析
C#コードとILコードの表示
シンボルや参照箇所の検索
アセンブリの比較
Visual Studioプロジェクトへのエクスポート
PDBやシンボルサーバーとの連携
クラス間の移動や使用箇所の検索がしやすいため、大規模なライブラリを読み進めたい場合に適しています。
dotPeekにはインストーラー版とポータブル版があり、ライセンスの購入や登録を行わずに利用できます。JetBrains
3-3. dnSpy・dnSpyEx:デバッグや編集もできる逆コンパイラ
dnSpyは、逆コンパイルだけでなく、ソースコードのない.NETアセンブリをデバッグ・編集できるツールです。元のdnSpyプロジェクトの更新は止まっていますが、後継としてdnSpyExが開発されています。GitHub+1
主な特徴は次のとおりです。
.NETアセンブリの逆コンパイル
逆コンパイルされたコードへのブレークポイント設定
ステップ実行
実行時の変数確認
メソッドやILの編集
.NET Framework、.NET、Unity関連アセンブリの解析
単にコードを読むだけでなく、実行時の挙動まで追跡したい場合に向いています。
ただし、アセンブリの編集機能は対象プログラムを破損させる可能性があります。必ずバックアップを作成し、権限のあるファイルだけを扱ってください。
3-4. Visual Studio・VS Codeのデコンパイル機能
Visual Studioには、外部.NETコードを自動的に逆コンパイルする機能があります。Visual Studio 2022 version 17.7以降では、外部コードへステップインしたときや、コールスタックから外部コードを選択したときに自動逆コンパイルできます。
逆コンパイルされたコードにはブレークポイントを設定でき、特定のアセンブリ全体をソースへ変換してシンボルファイルへ埋め込む機能もあります。Microsoft Learn
コード定義の確認だけであれば、Visual Studioの「逆コンパイルされたソースへの移動を有効にする」設定も利用できます。Microsoft Learn
VS Codeでは、ILSpyの公式拡張機能を導入する方法があります。ILSpy for VS Codeはクロスプラットフォームで動作し、VS Code内で.NETアセンブリを閲覧・逆コンパイルできます。C#拡張機能にもデコンパイル支援機能があります。GitHub+1
3-5. 各ツールの特徴・対応OS・向いている用途の比較
| ツール | 料金 | 主な対応環境 | 主な特徴 | 向いている用途 |
|---|---|---|---|---|
| ILSpy | 無料 | Windows、Linux、macOS | オープンソース、検索、プロジェクト出力、IL表示 | 初心者、DLL解析、日常的なコード確認 |
| dotPeek | 無料 | 主にWindows | 高機能な検索とナビゲーション、NuGet対応 | 大規模ライブラリの調査 |
| dnSpyEx | 無料 | 主にWindows | 逆コンパイル、デバッグ、アセンブリ編集 | 実行時解析、Unity、詳細なデバッグ |
| Visual Studio |

