【ハウツー】
さらにもう1つ、実行時に動的に機能を変更する例を見てみよう。MEFでは、処理を行う際に使用するクラスを簡単に切り替えることができることを確認できる(サンプルコードをこちらからダウンロードできる)。
今回は3つのプロジェクトを作成する。MEFComponent1プロジェクトとMEFComponent2プロジェクトは、実装が異なる2つのコンポーネントを用意するためのプロジェクトだ。そしてMEFSample2プロジェクトが、この2つのコンポーネントを切り替えて使用するためのプロジェクトとなっている。
まず、MEFSample2プロジェクトの方で、インタフェースを用意する。今回のサンプルでは文字列をやりとりするので、次のようなインタフェースを定義した。
public interface IMessageManager
{
string GetMessage(string name);
}
次に、このIMessageManagerインタフェースを実装したクラスを定義する。
まずMEFComponent1プロジェクトに、EnglishMessageManagerクラスを定義しよう。このクラスはIMessageManagerインタフェースを実装するので、MEFSample2プロジェクトへの参照を追加しておく必要がある。
また、MEFのコンポーネントとして使用できるようにするため、Export属性を追加しておく。Export属性を使用するために、System.ComponentModel.Compositionへの参照を追加し、System.ComponentModel.Composition名前空間をインポートしてから、次のソースコードを記述する。
[Export(typeof(IMessageManager))]
class EnglishMessageManager : IMessageManager
{
public string GetMessage(string name)
{
return "こんにちは," + name + "!";
}
}
続いて、MEFComponent2プロジェクトに、JapaneseMessageManagerクラスを定義する。メッセージが日本語になっていること以外は、EnglishMessageManagerクラスをほぼ同じソースコードになっている。
[Export(typeof(IMessageManager))]
class JapaneseMessageManager : IMessageManager
{
public string GetMessage(string name)
{
return "こんにちは," + name + "!";
}
}
最後にMEFSample2プロジェクトで、IMessageManagerインタフェースのインスタンスを生成し、使用する処理を記述しよう。ソースコードは次のようになる。
private void button1_Click(object sender, EventArgs e)
{
//exeファイルが存在するディレクトリにあるアセンブリを使用して、コンテナを生成する
var d_catalog = new DirectoryCatalog(".");
var container = new CompositionContainer(d_catalog);
IMessageManager ims = container.GetExportedObject<IMessageManager>();
MessageBox.Show(ims.GetMessage("MEF"));
}
MEFSample1と異なり、今度は実行ファイル自身のアセンブリではなく、実行ファイルが存在するディレクトリにあるアセンブリに含まれるクラスを使用することになる。そこで、指定されたディレクトリにあるアセンブリを使用する「DirectoryCatalog」クラスを使用して、コンテナを生成するような処理を行っている。
以上で、今回のサンプルは完成である。ビルドして実行した後、まずMEFComponent1.dllをMEFSample2.exeと同じフォルダに移動し、フォームのボタンをクリックしてみよう。すると「Hello,MEF!」というメッセージが表示されることを確認できる。
次に、MEFSample2.exeは起動したままで、MEFComponent1.dllを元のフォルダに戻した後、MEFComponent2.dllをMEFSample2.exeと同じフォルダに移動し、フォームのボタンをクリックしてみよう。すると「こんにちは、MEF!」というメッセージが表示されることを確認できる。
このように、プログラムを実行中であっても、動的にコンポーネントの切り替えができるのだ。まさにMEFが「Extensibility」を実現するためのフレームワークであることがお分かりいただけたと思う。
MEFはまだプレビュー版であるため、これからもさまざまな変更が行われる可能性はあるが、MEFによってどのような仕組みが実現できるかはご理解いただけただろう。今回は紹介できなかったが、Import属性や便利なカタログクラスなど、他にもさまざまな機能があるため、ぜひ一度MEFのWebサイトにも目を通してみていただきたい。
| Beta版で試す! VS 2010と.NET 4.0の新機能(2) - 関数型言語F#と、C#の強化点 [2009/9/16] |
| Beta版で試す! VS 2010と.NET 4.0の新機能(1) - ASP.NET Ajaxにおけるクライアントサイドレンダリング [2009/9/9] |
| .NET Framework 4+Visual Studio 2010で、開発者のスキル発揮をサポート [2009/9/1] |
| Microsoft、「Visual Studio 2010」の製品計画を明らかに [2008/9/30] |
| 最初にマスターしたいVisual Studioのデバッグ機能 - 応用編 [2008/8/19] |
| 米MS、Visual Studio 2008/ .NET Framework 3.5のSP1提供開始 [2008/8/12] |
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
[東京スカイツリータウン]1/2000の模型が登場 スカイツリーやオフィス、駅など精巧に再現 [12:00 5/27] ホビー |
|
【連載】これだけは要チェック! TOEIC(R)単語帳 第106回 今回のお題は…「afterward」 [12:00 5/27] キャリア |
|
【レポート】駆け出しイラストレーターのでこ、自分のDTPスキル不足を憂うの巻 [12:00 5/27] クリエイティブ |
|
AKB48指原莉乃がアシカとコラボ!「センターになりたいです…とか言えたら」 [11:30 5/27] エンタメ |
|
更伊俊介の小説「犬とハサミは使いよう」エースでマンガ化 [11:25 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。