我一直在试图找出这几天,没有运气。ImportMany与元数据无法导入
我试图使用[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
没有任何运气。
我能想到的唯一复杂因素是我使用的是使用MEFedMVVM的Cinch,它也使用MEF。我不想认为它干涉,但我不确定。
我想我做错了,任何人都可以理解这一点吗?
更新:
实现新的IComposer,与正是你所需要的目录。
虽然ImportMany仍然失败,但只有当我尝试导入元数据时才会这样。元数据仅仅是一对字符串,并且就我能够确定的而言,遵循这些示例。
最终找到原因:如前所述,IEditorSystem的实现位于独立的DLL中。 但是,任何新版本的dll都不会复制到主项目的输出子目录中。 我已经手动复制了第一个,并忘记将后生成的副本添加到dll项目。 哦,学到了一堆关于MEF的东西,所以不能完全浪费天:)
我将其更改为IEnumerable,但导入从未似乎完成,EditorSystemList保持在[0] ... – Kage 2010-09-03 03:48:55
您是否尝试运行上面的确切代码?你应该能够创建一个控制台应用程序来测试。 – JoshVarga 2010-09-03 15:06:05
是的,控制台版本可以工作,但它看起来可能是由于MEFedMVVM搞砸了,会更新 – Kage 2010-09-04 09:28:42