既にコンパイルされたアセンブリをソースコードもPDBファイルもなしでデバッグするのは難しい。Red Gateの.NET Reflectorを使えば、Visual Studio上でアセンブリを逆コンパイルし、ソースコードがあるアセンブリのようにデバッグできる。
.NET ReflectorのVisual Studio統合は(VS及びVSProエディション)知っておいたほうがいいだろう。標準のオブジェクトブラウザはpublicのメソッドとクラス(画像1)しか覗けないが、.NET Reflectorのオブジェクトブラウザ(画像2)を使えば、internalのクラスやメソッドの内部を覗ける。.NET ReflectorのVisual Studioアドインを使えば、簡単に逆コンパイルができる。アセンブリをデバッグするには、対象のアセンブリをソリューションエクスプローラ上で右クリックして"Enable debugging"を選択すればいいだけだ。こうすることで、.NET Reflectorは対象アセンブリのPDBファイルを生成する。 PDBファイルが生成されれば、ユーザは対象アセンブリのコードにステップスルーできる。ブレイクポイントを置いて、通常のデバッグ方法でデバッグできるのだ(画像4)。
(クリックして拡大)
画像1. 標準のオブジェクトブラウザ
(クリックして拡大)
画像2. .NET Reflectorのオブジェクトブラウザ
画像3. 既にコンパイルされたアセンブリのデバッグを有効にする
(クリックして拡大)
画像4: 既にコンパイルされたアセンブリをデバッグする
Visual Studioを使ってこのような方法でデバッグできれば、サードパーティー製のアセンブリの問題を診断するのが簡単になるだろう。
InfoQの記者であるJonathan Allen氏は次のように書いている。
複数のチームでプロジェクトを進めていると外部の会社のメンバーがソースコードなしのアセンブリを送ってくることがあります。また、国の反対側で働いているチームや、他国のチームとのコミュニケーション遅延で1日費やしてしまうこともあります。このツールを使い、とても便利で驚きました。わずかな時間で自分で問題解決を行い、テストサーバにアップして動作確認ができるのです。
現時点でこのツールには2つの不満しかありません。ひとつは、 C++ CLIのアセンブリに対応していないことです。私は代わりにJetBrainのdotPeekを使っています。 もうひとつは、ソリューションファイルなしでデバッグするときに、任意のアセンブリを開く方法が明らかでないことです。実行プロセスに簡単にアタッチできるのですが、実際に中身を確認するには例外を発生させる必要があります。そうすることでスタックを行き来して必要なところにブレイクポイントを置けるようになります。"
.NET Reflectorは多くのアドインをサポートしており、Red Gateは人気のツールPowerCommandsアドインをReflectorに統合した(画像5)。
画像5: PowerCommands
Red Gateの.NET Reflectorは商用ツールだ。新しい技術にも対応するため定期的に更新されている。7月22日には.NET Reflector 7.6.0.808がダウンロードできるようになっている。
Reflectorを何年も使っている開発者Sergey Barskiy氏は次のように書いている。
7.6が出たときにはとても興奮しました。このバージョンは新しい技術をサポートしているのです。Windows 8やWinRT、Visual Studio 2012、.NET 4.5、C# 5がMicrosoftからリリースされていますが、Reflector 7.6はこれらすべてをサポートしています。
2011年3月のリリースでRed Gateが.NET Reflector 7を商用で提供し始めると、競合が競合製品を無償で提供し始めた。JetBrainsのDotPeek、TelerikのJustDecompile、ILSpy、そしてCodeReflectだ。
JetBrainsのDotPeek(画像6)は最も先進的な.NET逆コンパイラのひとつだ。コード生成の品質も高く、ソースサーバからコードを取得することもできる。ナビゲーション機能やキーボードショートカットもとても便利だ。シンボルの検索も正確でプラグインもサポートしている。ただし、Visual Studioには統合されていない。
(クリックして拡大)
画像6. DotPeek
TelerikのJustDecompileは無料で利用できる逆コンパイラでコード生成の品質が高い。逆コンパイルしたアセンブリのプロジェクトを作成できる。強力な検索機能を持ち、文字列やシンボルの検索ができる。プラグインにも対応しており、すでにふたつの拡張が利用できる。
(クリックして拡大)
画像7. JustDecompile
(クリックして拡大)
画像8. JustDecompileの検索ダイアログ
ILSpyはMITライセンスで配布されている唯一のオープンソース逆コンパイラだ。優れたコード生成機能とハイライト機能を持っている。逆アセンブルして生成したコードをひとつのファイルで出力することもできるし、すべてのファイルを含むプロジェクトを作成することもできる。ILSpyはスタンドアロンのツールだ。
(クリックして拡大)
画像9. ILSpy
CodeReflectは競合製品に引けを取らない製品だ。機能は選び抜かれており、コード生成機能や構文のハイライト機能もとても基本的だ。ファイルの保存やプロジェクトの作成はできない。逆コンパイルしたコードをコピーできるだけだ。Visual Studio統合もサポートされていない。
(クリックして拡大)
画像10. CodeReflect
Visual Studio統合に費用を払うかどうかは別にして考えても、商用無料を問わず.NETの逆コンパイラの選択肢は充実していると言えるだろう。