2014年6月20日金曜日

UnityでMono.Cecilを使う時の勘所

UnityでMono.Cecilの使う時の勘所

Mono.Cecilとは?

Mono.Cecilとは、.NETのCIL(共通中間言語)を操作するためのライブラリです。 .NETのDLLやexeを、生成したり改変したりすることが可能になります。

何に使うの?

主に

  • アスペクト指向言語の実装
  • コードの最適化
  • コードの難読化
  • リフレクションを使っている部分を置き換えて高速化
のために使われることが多いです。 ただし、かなりの黒魔術っぷりなのでむやみやたらには使わないようにしましょう。

Unityで使うときのはまりどころ

実機上(iPhoneやandroid)ではMono.Cecilは使えません

この辺は、.NET2.0subsetで動かすことになると思いますので、CILをいじるためのクラスをつかうMono.Cecilは使えません。 なので、基本はMono.CecilはEditorディレクトリ内にいれて、Editor上でのみで使用することになります。 iPhoneの場合は、AOTの為原理的に使用不可能です。 androidはJITなので、もしかしたらfullsetなら動くかもしれませんが未検証です。

.NET 2.0でビルドしましょう

.NET2.0用にビルドしないと動きません。

また、ビルドするときはMonoDevelopは絶対に使わないようにしましょう。MonoDevelopが糞なので、完全な.NET2.0のバイナリにビルドしてくれません。

手順としては、
  1. Mono.Cecilのソースコードをcloneしてくる
  2. Mono.Cecil.slnをXamarin studioやVisual studioで開く
  3. コンフィグレーションをnet_2_0_Release(またはdebug)にする
  4. プロジェクトオプション>ビルド>一般のTarget frameworkをMono / .NET 2.0に変更
  5. 一応クリーンをして、プロジェクトを全てビルド
  6. {Mono.Cecil}/bin/net_2_0_Releaseに出力されているdllをUnityプロジェクトのEditorディレクトリにコピー
これでUnityのEditor機能を作る際にMono.Cecilを使えるようになります。

デバッグ情報をきちんと出力しましょう

デフォルトだと、デバッグ情報を生成してくれません。そのため、DLLを改変した場合、例外のスタックとレースのファイルと行数が激しくずれてしまいます。 なので、ここを参考に、DLL出力時にデバッグシンボルを保存する設定をきちんとしてあげましょう。

0 件のコメント:

コメントを投稿