MEF(Managed Extensibility Framework)メソッド:
MEFのインポート/エクスポート機能を利用するプロジェクトにSystem.ComponentModel.Compositionへの参照を追加する必要があります。
まず、ブートストラッパー/ローダー(私の場合は、メインクラスに追加しただけです)。
Program.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using MEFContract;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
var prgm = new Program();
// Search the "Plugins" subdirectory for assemblies that match the imports.
var catalog = new DirectoryCatalog("Plugins");
using (var container = new CompositionContainer(catalog))
{
// Match Imports in "prgm" object with corresponding exports in all catalogs in the container
container.ComposeParts(prgm);
}
prgm.DoStuff();
Console.Read();
}
private void DoStuff()
{
foreach (var plugin in Plugins)
plugin.DoPluginStuff();
}
[ImportMany] // This is a signal to the MEF framework to load all matching exported assemblies.
private IEnumerable<IPlugin> Plugins { get; set; }
}
}
IPluginインターフェースは、インポートとエクスポートの間のコントラクトです。すべてのプラグインがこのインターフェースを実装します。契約は非常に簡単です:
IPlugin.cs:
namespace MEFContract
{
public interface IPlugin
{
void DoPluginStuff();
}
}
最後に、さまざまなアセンブリで必要な数のプラグインを作成できます。それらはコントラクトインターフェイスを実装する必要があり、対応するインポートと一致する必要があることをMEFに示すために「エクスポート」属性で装飾する必要があります。次に、dllを「プラグイン」フォルダにドロップします(このフォルダは実行可能ファイルと同じ場所にある必要があります)。サンプルプラグインは次のとおりです。
Plugin.cs:
using System;
using System.ComponentModel.Composition;
using MEFContract;
namespace Plugin
{
[Export(typeof(IPlugin))]
public class Plugin : IPlugin
{
public void DoPluginStuff()
{
Console.WriteLine("Doing my thing!");
}
}
}