ITaggerとIWpfTextViewMarginがあり、どちらもMEFコンポーネントとしてエクスポートされます。マージンコードに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をスローするという問題が発生しました。パラメータがなぜこれなのかわかりません。カタログを渡そうとしましたが、例外はありませんが、インポートもnullです。また、デバッグmefの失敗についても言及し、エクスポートされたクラスには正しいコントラクト名とエクスポートタイプのIDがあると信じています。
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.
したがって、1つの解決策は、IClassificationTypeRegistryServiceをエクスポートするアセンブリを追加することです。これはVisualStudioコアエディターサービスですが、どのアセンブリがそれをエクスポートするかがわかりません。誰もがこれを知っていますか?
または、より良い解決策はありますか?