通常,当您尝试覆盖应用程序中已经存在的导出时,您将获得一个基数异常,[Import(typeof(IFoo)]
因为 MEF 期望只有一个匹配的导出可用。
但是,您可以将插件放在单独的导出提供程序中并给予优先权。在这里,我为应用程序文件夹中的“插件”子文件夹执行此操作:
Assembly executingAssembly = Assembly.GetExecutingAssembly();
string exeLocation = Path.GetDirectoryName(executingAssembly.Location);
string pluginPath = Path.Combine(exeLocation, "plugins");
var pluginCatalog = new DirectoryCatalog(pluginPath);
var pluginExportProvider = new CatalogExportProvider(pluginCatalog);
var appCatalog = new DirectoryCatalog(exeLocation,"*");
var appExportProvider = new CatalogExportProvider(appCatalog);
var container = new CompositionContainer(
pluginExportProvider, appExportProvider);
pluginExportProvider.SourceProvider = container;
appExportProvider.SourceProvider = container;
传递给组合容器的导出提供程序的顺序决定了优先级:如果插件和应用程序部分都提供导出,则插件将获得优先级。