我创建了一个MEF插件控件,我将其导入到我的应用中。现在,我希望该插件能够从应用程序导入部件。我无法想象如何在插件中设置目录,以便它可以从应用程序中找到导出。有人能告诉我这是怎么做到的吗?下面是我的代码,当我尝试使用当前正在执行的程序集创建AssemblyCatalog时,该代码无效。
[Export(typeof(IPluginControl))]
public partial class MyPluginControl : UserControl, IPluginControl
[Import]
public string Message { get; set; }
public MyPluginControl()
{
InitializeComponent();
Initialize();
}
private void Initialize()
{
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer container = new CompositionContainer(catalog);
try
{
container.ComposeParts(this);
}
catch (CompositionException ex)
{
Console.WriteLine(ex.ToString());
}
}
}
答案 0 :(得分:2)
您不需要这样做。
确保您导入此插件时使用的目录包含主应用程序的程序集。
当MEF构造你的类型以便导出它时(为了在其他地方完成IPluginControl
导入),它已经为你编写了这部分 - 并且在那时,将导入“消息”字符串(尽管,您最有可能为该“消息”指定一个名称,或者某种类型的自定义类型 - 否则,它只会导入一个字符串,并且您只能在应用程序的任何位置使用单个“字符串”导出。 / p>
当MEF组成部件时,它会找到与指定类型匹配的所有类型(在本例中为IPluginControl
),实例化单个对象,填充该对象的任何[Import]
要求(这就是为什么你要'我需要在你的构造函数中组合它,然后将它分配给任何导入该类型的对象。