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

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

 MoMAツール自身のテストでは、たいした情報が得られなかったので、別のアプリケーションをテストすることにした。そこでフォームベースの簡単なアプリケーションを作成してテストしたが、やはりたいした情報は得られなかった。問題なくパスしたのである。もっと大きなアプリケーションをテストする必要があった。

 100万行にも上る業務品質のソフトウェアを自分で作成し、本記事執筆のためのテスト用に使うというのも面白そうだが、わたしが記者としての仕事をそっちのけにして10年間もかかるような開発に取り組むのを上司が喜ぶとは思えない。というわけで、.NETで書かれた幾つかの既存のプログラムをテストすることにした。

 その1つが「Paint.NET」である。この素晴らしいペイントツールは、古くからWindowsに付属するPaintの.NETバージョンから本格的なツールに進化したもので、Adobe Photoshopに匹敵するという人もいる。

 テストでは、MoMAを使ってPaint.NETに付属するすべてのバイナリを処理した。今回は、すべて合格というわけにはいかなかった(Paint.NETを批判しているわけではない)。まず、Paint.NETには非.NETアセンブリが幾つか含まれており、これらはスキップされた。しかし残りのバイナリは.NETアセンブリだったのでスキャンされた。

 今回は以下のような結果になった。

  • All methods called exist in Mono――これに関しては合格だ
  • P/Invokes called: 157
  • Methods called that throw NotImplementedException: 7
  • Methods called marked with [MonoTodo]: 58

 これらが意味するのは、このプログラムはそのままMonoランタイム上では動作できない、つまりコードを修正する必要があるということだ。MoMAの素晴らしいところは、エラーを見つけると、どこが間違っているのかを示した詳細なリポートをHTMLファイルで提供してくれる点である。「View Detail Report」リンクをクリックすると、デフォルトに設定したブラウザでリポートが表示される。

mono4

 このリポートの左の欄はアセンブリごとに分類されており、右側の欄には4つのそれぞれのカテゴリの問題が示される。問題のあるアセンブリをクリックすると、問題の関数呼び出しに関する詳細な説明が表示される。Paint.NETの場合、すべてのアセンブリにわたって「NotImplementedException」と「MonoTodo」の問題が散見されたが、いずれもたいした問題ではなかった。また、ほぼすべての「P/Invoke」が1つのアセンブリに含まれていることも分かった。Paint.NETをMono上で動作させるには、このアセンブリを全面的に修正する必要があるだろう。

 わたしはPaint.NETの開発者を知らないので、彼らを代弁することはできない。しかし彼らはFAQの中で、このソフトウェアをMonoに移植するつもりがないことを明確にしている。だが興味深いことに、彼らがシステムコールを1つのアセンブリに隔離するという巧みな処理を行ったことをMoMAツールは示している。おそらく意図的にそうしたものと思われる――将来的な移植のためではなく、単に彼らが優秀な開発者であるからなのだろう。(それは彼らのブログを見れば分かる。例えば、堅固なソフトウェアを作成するためにC#のパラメータ検証機能を使用する方法に関する項目もある。)

 もちろん、これらのシステムコールが含まれるDLLは、それ自体が非常に巨大であり、大量のコードがそこに記述されているのは明らかだ。これを移植するのは容易な仕事ではない。しかしその仕事を引き受けようという人がいた場合、MoMAを使えば、どの部分で移植作業が必要なのかが明確になる。

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.

注目のテーマ