//定义部件合同
public interface IPluginDemo
{
string Text { get; }
Guid GID { get; set; }
void Do();
}
//定义部件元标记合同
public interface IPluginID
{
string Name { get; }
}
//定义元标记
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class PluginIDAttribute : Attribute, IPluginID
{
public string Name { get; private set; }
public PluginIDAttribute(string pName)
{
this.Name = pName;
}
}
//初始化目录并导入部件
private void Init()
{
//设置目录,让引擎能自动去发现新的扩展
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("plugins")); //等同于下行
//catalog.Catalogs.Add(new DirectoryCatalog(Application.StartupPath + "\\plugins\\"));
//创建一个容器,相当于是生产车间
_container = new CompositionContainer(catalog);
//调用车间的ComposeParts把各个部件组合到一起
try
{
this._container.ComposeParts(this);//这里只需要传入当前应用程序实例就可以了,其它部分会自动发现并组装
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
public Form1()
{
InitializeComponent();
Init();
}
//定义导入,延迟导入
[ImportMany]
public Lazy<IPluginDemo, IPluginID>[] plugins;
//根据插件生成菜单
ToolStripMenuItem item = new ToolStripMenuItem("插件");
ms.Items.Add(item);
foreach (var plugin in plugins)
{
ToolStripMenuItem subItem = new ToolStripMenuItem(plugin.Metadata.Name);
if (plugin.Metadata.Name == "插件1菜单")
{
subItem.ForeColor = Color.Red;
}
else {
}
subItem.Click += (s, arg) => { plugin.Value.Do(); };
item.DropDownItems.Add(subItem);
}