我有一个 ITagger 和一个 IWpfTextViewMargin,它们都作为 MEF 组件导出。我想在我的 Margin 代码中导入 ITagger,然后在该 Tagger 中使用一些成员。
现在我尝试在 Margin 类中使用 ComponentContainer,然后导入 IViewTaggerProvider。我使用了以下代码,可以在许多 MEF 教程中找到
[Import(typeof(IViewTaggerProvider))]
public IViewTaggerProvider vt_provider { get; set; }
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestMargin).Assembly));
_container = new CompositionContainer(catalog);
//Fill the imports of this object
try
{
this._container.ComposeParts(this);
}
catch (CompositionException compositionException)
{
System.Diagnostics.Trace.WriteLine(compositionException.Message);
}
和出口代码。
[Export(typeof(IViewTaggerProvider))]
[ContentType...
导出的类在另一个命名空间中定义,但在同一个程序集中。
在这里,我遇到了 ComposeParts(this) 抛出 ImportCardinalityMismatchException 的问题。我不知道为什么参数是this。我试图将目录传递给它,没有例外,但导入也是空的。我还提到了调试 mef 失败,并认为导出的类具有正确的合同名称和导出类型标识。
在使用 Visual MEFx 检查程序集并调试后,我发现可能是因为 IViewTaggerProvider 导入了 Visual Studio IClassificationTypeRegistryService,它也是 MEF 部件,导致 IViewTaggerProvider 被拒绝。
[Primary Rejection]
[Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No valid exports were found that match the constraint '((exportDefinition.ContractName == "Microsoft.VisualStudio.Text.Classification.IClassificationTypeRegistryService") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "Microsoft.VisualStudio.Text.Classification.IClassificationTypeRegistryService".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', invalid exports may have been rejected.
所以一种解决方案是添加导出 IClassificationTypeRegistryService 的程序集。这是一个 Visual Studio 核心编辑器服务,但我找不到哪个程序集导出它。有人知道吗?
还是有更好的可能解决方案?