「MoMA」を使って.NETアプリをLinuxのMonoに移植してみる.NET互換性検証ツールレビュー(2/5 ページ)

» 2009年04月13日 08時00分 公開
[Jeff Cogswell,eWEEK]
eWEEK

 実際には、MoMAはとても小さなツールだ。機能も極めてシンプルだ。.NETバイナリのリストを指定するだけで、同ツールはそれらを分析し、Monoに実装されていないクラスや関数への呼び出し、およびOSへの直接呼び出しを探す。

 驚く読者もいるかもしれないが(わたしも驚いた)、このツールはバイナリを分析するのだ。最初は、リバースエンジニアリングのようなことをやっているのではないだろうかと思った。しかし、.NET CLIランタイム上で動作する“バイナリ”というのは、実際には実行形式ファイルのリソースに保存されたP-codeなのである。これらのファイルは「アセンブリ」と呼ばれる。

 MicrosoftのSDK(ソフトウェア開発キット)に含まれる「ILDASM(Intermediate Language Disassembler)」ツールを使えば、バイナリのリバースエンジニアリングをいとも簡単に行える。ILDASMはCLIバイナリファイルを容易にオープンし、そのファイルについて記述したメタデータ、そして実際のアセンブリコードを調べる。

 しかしこの“アセンブリ”コードはIntelアセンブリではなく、P-codeである。これはIL(中間言語)と呼ばれるアセンブル形式で、本来のアセンブリ言語よりもはるかに高レベルの言語である。言い換えれば、MoMAツールはソースコードを参照しなくても、容易にバイナリファイルをオープンして詳細な検査(どのライブラリを呼び出しているか調べるなど)を行えるということだ。

 もちろん、MoMAで問題が検出された場合は、自分で変更を行う必要がある。つまり、元のソースコードを修正してリコンパイルする必要があるということだ。しかし考えてみれば、厳格な規格に準拠したP-codeにコンパイルされた中間コードのおかげで、MoMAのようなツールにとっては、混沌としている可能性があるソースコードを分析するよりも、バイナリを分析する方がはるかに容易になるのだ。

 しかし話はこれで終わりではない。Monoに付属するランタイムは、.NET環境でコンパイルされたバイナリを処理することもできる。MoMAで問題が検出されなければ、それをMono環境でリコンパイルする必要はない(やろうと思えばできるが)。Monoランタイムを起動し、.NETプログラムの名前をコマンドラインパラメータとして渡すだけで、そのプログラムはMono環境でそのまま動作する(はずだ)――Linux上のMonoでも大丈夫だ。

 信じられないのであれば、試していただきたい。まず、Visual Studioで簡単なフォームアプリケーションを作成し、それをコンパイルする。次にLinuxを立ち上げる。Linuxのコマンドプロンプトから「mono」と入力し、さらに「form1.exe」ファイルのフルパスとファイル名を渡す(「form1」の部分には実際のファイル名が入る)。冗談抜きで、それはLinux上で動作するはずだ。ただし、Formsライブラリを含め、すべてのMonoライブラリがインストールされていることが条件である。しかし、デフォルトではFormsライブラリが含まれていない可能性がある。その場合、表示されたエラーメッセージをGoogleで検索すると、インストールの方法を示した説明が見つかるはずだ。その上で、Visual Studioで作成したプログラムがLinux上で動作するかどうか試していただきたい。

Editorial items that were originally published in the U.S. Edition of “eWEEK” are the copyrighted property of Ziff Davis Enterprise Inc. Copyright (c) 2011. All Rights Reserved.

注目のテーマ