MEFの基礎(ExportとImport)
あまり MEF の意義を理解していないように思うが、徒然なるままに。
Addin1.cs
using System.ComponentModel.Composition; namespace test.mef.basic { [Export] public class Addin1 { /// <summary> /// メッセージ /// </summary> public string Msg { get { return "Addin1です"; } } } }
Addin2.cs
using System; using System.ComponentModel.Composition; namespace test.mef.basic { [Export] public class Addin2 { /// <summary> /// 整数足し算 /// </summary> public void addInts(int x, int y) { Console.WriteLine("Addin2より:結果は {0} です。", (x + y)); } } }
Module1.cs
using System; using System.ComponentModel.Composition; namespace test.mef.basic { public class Module1 { //Addin1をインポート [Import] private Addin1 a1 { get; set; } //Addin2をインポート [Import] private Addin2 a2 { get; set; } /// <summary> /// Addin1のMsgを表示 /// </summary> public void showMsg() { Console.WriteLine(a1.Msg); } /// <summary> /// Addin2のaddIntsを実行 /// </summary> public void executeAdd(int x, int y) { a2.addInts(x, y); } } }
Program.cs
using System; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Reflection; namespace test.mef.basic { class Program { static void Main(string[] args) { //現在実行中のアセンブリからカタログを作成 var catalog = new AggregateCatalog(); catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); //カタログからコンテナを生成 var container = new CompositionContainer(catalog); //モジュール1のインポートを満たす var m1 = new Module1(); container.SatisfyImportsOnce(m1); m1.showMsg(); m1.executeAdd(2,3); #if DEBUG Console.ReadLine(); #endif } } }
結果
Addin1です Addin2より:結果は 5 です。
ちなみにProgram.csにSystem.ComponentModel.Compositionの参照がないと「引数 1: '・・・' から 'System.ComponentModel.Composition.Primitives.ComposablePart' に変換できません」とエラーがでて怒られます。エラーメッセージから推測できずちょっとはまった。