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式で記述されていても、逆コンパイル結果では別の形式になることがあります。asyncawait、イテレーター、ラムダ式なども、コンパイル時にステートマシンや生成クラスへ変換されるため、完全に同じ記述へ戻るとは限りません。

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