MEF(托管可扩展性框架)方法:
您需要将System.ComponentModel.Composition的引用添加到使用 MEF 的导入/导出功能的项目中。
首先,引导程序/加载程序(在我的例子中,我只是将它添加到 Main 类)。
程序.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();
}
}
最后,您可以在不同的程序集中创建任意数量的插件。它们必须实现合同接口,并且还使用“Export”属性进行修饰,以向 MEF 指示它们应该与任何相应的导入相匹配。然后将 dll 放入“插件”文件夹中(该文件夹应与可执行文件位于同一位置)。这是一个示例插件:
插件.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!");
}
}
}