【发布时间】:2012-04-25 07:10:32
【问题描述】:
我有一个 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。我试图将 catalog 传递给它,没有例外,但导入也是空的。我还参考了debug mef failures,并认为导出的类具有正确的合同名称和导出类型标识。
在用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 核心编辑器服务,但我找不到哪个程序集导出它。有人知道吗?
或者有更好的解决方案吗?
【问题讨论】:
-
如果您创建一个导入列表和导出列表,它会更容易提供帮助。我认为“消费”基本上是指
[Import]ing -
@jberger:也许我试过你说的。我更新了我的问题,似乎是一个新问题
-
Margin班级的签名是什么? -
@jberger:你说的签名是什么意思?
-
它的相关因素、进口、出口等是什么?
标签: c# .net visual-studio-2010 mef vs-extensibility