WPFを中心に書いています。Technologies。Xamarinさて前回、Mono.Cecilを利用した静的なAOPについて解説しました。今回はいよいよXamarin.iOSでも動作する、静的なAOPの実装について解説したいと思います。Mono.Cecilを使ってILを織り込むFodyのアドインを作成し、コンパイル時に自動的にILを織り込むところまでを解説します。具体的にはViewModelのメソッド呼び出し時にDebug.WriteLineでクラス名とメソッド名をログ出力するサンプルを作成します。「使い勝手の良いAOPフレームワーク」は、まだまだお預けですが、今回を理解すればあとはILを「頑張れば」できたも同然でしょう(つまり先はまだ長いです)。内容に入って行きましょう。ログを織り込み対象のXamarinアプリを作成するFodyアドインを作成するアドインをNuGetパッケージ化するILの編集対象プロジェクトへ、Fodyアドインを導入する最後にログを織り込み対象のXamarinアプリを作成するまずはテスト対象のXamarinアプリをサクッと作りましょう。こんな感じのボタンとラベルが表示されていて、ボタンをクリックするとラベルに表示されているカウントがインクリメントされていくだけの、シンプルなアプリケーションです。ViewModelにはCountUpメソッドが定義されており、ボタンにバインドされているCountUpCommandが実行されるとCountプロパティがインクリメントされるよう実装されています。}詳細なコードはGithubに公開していますのでこちらをご覧ください。github.comこちらのXFodyAppプロジェクトを参照してください。Fodyアドインを作成するそれではここから、実際にILを編み込むFodyのアドインを作成します。1.3クラスライブラリを作成し(Mono.Cecilに合わせています)、NuGetからFodyCecilを適用しましょう。Fodyのアドインは「〜.Fody」と言う命名規則で作成する必要があります。アドインはクラス名も決められています。「ModuleWeaver」と言う名称で「ルート名前空間上に」作る必要があります。アドイン処理はExecuteメソッドに実装していきます。ModuleDefinitionプロパティを必ず定義する必要があります。次のコードがミニマムな実装になります。何もIL操作していませんが。}}ModuleDefinitionプロパティに、アスペクトを編み込む対象のアセンブリ情報がFodyから設定された上で、Executeメソッドが呼び出されます。ILを編集するコードはサクッとこんな感じで実装します。}}名称が「ViewModel」で終わるクラスの全てのメソッド呼び出し時に、クラス名とメソッド名をログ出力するようILを織り込んでいます。今回は詳細な解説は省きます。この辺りの詳細は前回のエントリーをご覧ください。これでFodyアドインの実装は完了しました。アドインをNuGetパッケージ化するさてアドインを適用するためには、ライブラリをNuGetパッケージ化する必要があります。これにはFodyの仕様上の問題なのですが、Fodyの設定ファイルに記載されているアドインのアセンブリをロードする際、Fodyのアセンブリが展開さているローカルファイルシステム上の、Fodyと兄弟関係にあるフォルダを相対的に探しに行くからです。このため、FodyはNuGetから適用するでしょうから、FodyのアドインもNuGetパッケージ化する必要があります(無理やり手で置いても動作しますが)。Studioのプロジェクトプロパティのパッケージタブで「構築時にNuGetパッケージを生成する」にチェックするだけで簡単にNuGetパッケージを作成できます。この方法で作成したFodyアドインのNuGetパッケージは、正しく動作しません。ダメかと言いますと、作成したアセンブリ(dll)がNuGetパッケージ内のどこに配置されているか、Fodyが期待するパスと異なるパスに配置されてしまい、Fodyが発見できないためです。Standardのnupkgファイルを展開すると、次のようなフォルダ構成になっています。dllはサブディレクトリである「lib¥netstandardX.X」フォルダに配置されます。Fodyはnupkgファイルを展開した直下にdllが配置されていることを期待します。Standard以前の)仕様のためだと思いますが、(きっとそのうち解消されるでしょうけど)仕方ないのでパッケージは手で作成しましょう。適当なフォルダにHello.Fody.nuspecと言う名称でテキストファイルを作成し、次のように記述します。</metadata></package>Hello.Fody.nuspecファイルを作成したら、同じディレクトリに先ほど作成したアドインのdllとpdbファイルを配置しましょう。nuget.exeをダウンロードして次のように実行しましょう。Hello.Fody.nuspecHello.Fody.nuspecのパスは適宜修正してください。さぁこれでNuGetパッケージの作成が完了しました。次はアスペクトを織り込みます。ILの編集対象プロジェクトへ、Fodyアドインを導入するではアスペクトを織り込む対象のプロジェクトにNuGetパッケージを適用しましょう。今回はNuGetのサービスサイトにはアップロードせず、ローカルのファイルシステムから適用します。「NuGetパッケージの管理」を開き、右上の歯車マークをクリックしましょう。開かれたWindowで、先ほど作成したローカルのパスを指定します。ローカルパスを登録したら、パッケージソースに作成したものを指定してHello.Fodyパッケージをインストールしてください。インストールしたら「FodyWeavers.xml」と言うファイルをプロジェクト直下に作成します。ここに作成したHello.Fodyアドインを適用するように記述します。<Hello/></Weavers>.Fodyは削除して記述しましょう。さあ、あとはビルドして完成です。イメージと違いましたか?サンプルは「ViewModelのメソッド呼び出し時にDebug.WriteLineでログ出力する」仕様のため、ビルド時にプロパティのSetterやGetterとして生成されているメソッドに対しても、ログ出力が織り込まれていることになります。StandardのXamarinプロジェクトへ適用することができました。Worldレベルの話で、AOPライブラリとしては全くの未完成です。ここまでくればあとは頑張ってILを生成するコードを実装すれば実現できる...はずです。CalenderまでにAOPフレームワークっぽいものが完成していることを祈っておいてください。いう訳で今回はここまで。Appの簡単な利用方法を解説しました。(1)はてなブログをはじめよう!nuitsjpさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。