【发布时间】:2010-09-02 08:07:08
【问题描述】:
我这几天一直在尝试解决这个问题,但没有成功。
我正在尝试使用 [ImportMany] 从一个充满 DLL 的目录导入 IEditorSystem 类型的导出,这些导出具有 IEditorSystemMetadata 类型的自定义元数据。我想先获取元数据,然后将其推送到一些文本框等,以便用户可以选择要使用的 EditorSystem,并在选择时加载该系统...
我一直在尽可能地遵循示例,这就是我目前所掌握的。
[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
这是它应该导入的内容:
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem: IEditorSystem
{
public MyEditorSystem()
{
}
}
和启动:
AggregateCatalog Catalog = new AggregateCatalog(
new DirectoryCatalog(@".\EditorSystems"),
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer Container = new CompositionContainer(Catalog);
Container.ComposeParts(this);
我可以在 Catalog.Parts 中看到 MyEditorSystem 和具有 ImportMany 的视图模型,但 EditorSystemList 永远不会被填充。我没有收到任何合成错误。
我认为这可能与懒惰有关,所以我尝试了
public ObservableCollection<IEditorSystem> EditorSystemList
也没有运气。
我能想到的唯一复杂情况是我正在使用 Cinch,它使用 MEFedMVVM,它也使用 MEF。我不认为它会干扰,但我不太确定。
我觉得我做错了,有人能理解吗?
更新:
实现一个新的 IComposer,其中包含您需要的目录。
ImportMany 仍然失败,但只有当我尝试使用它导入元数据时。元数据只是几个字符串,据我所知,遵循示例。
终于找到了原因:如前所述,IEditorSystem 的实现位于单独的 DLL 中。 但是,dll 的任何新版本都不会复制到主项目的输出子目录。 我手动复制了第一个,忘记将构建后的副本添加到 dll 项目中。 哦,好吧,学到了很多关于 MEF 的东西,所以没有完全浪费时间 :)
【问题讨论】:
标签: mef