3

私は奇妙なMEFの問題を抱えています。これをテストプロジェクトでテストしましたが、すべてうまく機能しているように見えますが、実際のプロジェクトでは何らかの理由で機能していません

これはエクスポートコードです

    public void RegisterComponents()
    {

        _registrationBuilder = new RegistrationBuilder();
         _registrationBuilder
            .ForTypesDerivedFrom(typeof(MyType))
            .SetCreationPolicy(CreationPolicy.NonShared)
            .Export();

        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyType).Assembly, _registrationBuilder));


        var directoryCatalog = new DirectoryCatalog(PathToMyTypeDerived, _registrationBuilder);
        catalog.Catalogs.Add(directoryCatalog);

        _compositionContainer = new CompositionContainer(catalog);
        _compositionContainer.ComposeParts();

        var exports = _compositionContainer.GetExportedValues<MyType>();
        Console.WriteLine("{0} exports in AppDomain {1}", exports.Count(), AppDomain.CurrentDomain.FriendlyName);
    }

exports count は 0 です :( 理由はありますか?

ログファイルには、これがたくさんあります

System.ComponentModel.Composition 情報: 6 : エクスポートが含まれていないため、ComposablePartDefinition 'SomeOthertype' は無視されました。

「someOtherType」のエクスポートに興味があったので、これで問題ないと思いますが

更新: このリンクを見つけましたが、デバッグした後は賢明ではありませんが、適切にフォローアップしていない可能性があります。

ご指摘ありがとうございます

乾杯

4

1 に答える 1

3

私はちょうど同じ問題を抱えていたので、この記事は私を大いに助けてくれました。

解決が失敗するさまざまな理由について説明します。より重要なものの 1 つは、解決したいタイプの依存関係の依存関係が登録されていないことです。

私が大いに役立ったのは、アプリケーションをデバッグするときに [出力] ウィンドウに書き込まれるトレース出力です。型を解決できなかった理由を正確に説明します。

この出力でも。深さは 1 レベルしかないので、少し掘り下げる必要があるかもしれません。

例:

タイプ A を解決したかったのですが、次のようなメッセージが表示されました。

System.ComponentModel.Composition 警告: 1: ComposablePartDefinition 'Namespace.A' は拒否されました。構成は相変わらず。次のエラーのため、変更は拒否されました: 構成で複数の構成エラーが発生しましたが、根本的な原因は 1 つです。根本的な原因を以下に示します。詳細については、CompositionException.Errors プロパティを確認してください。

1) 制約に一致するエクスポートが見つかりませんでした: ContractName Namespace.IB RequiredTypeIdentity Namespace.IB

結果: 一部の 'Namespace A' に import 'Namespace.A..ctor (Parameter="b", ContractName="namespace.IB")' を設定できません。要素: Namespace.A..ctor (Parameter="b", ContractName="Namespace.IB") --> Namespace.A --> AssemblyCatalog (Assembly="assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken =...")

しかし、私ははっきりと の部分を見ましたNamespace.IB。それで、デバッガーで、それを解決しようとしました。そして、別のトレース出力を取得しました。今回Namespace.IBは、インポートの1つにエクスポートが欠落していたため、の実装を解決できないとのことでした。基本的には上記と同じメッセージですが、タイプが異なります。そして今回は、その不足している輸入品の部品が見つかりませんでした。これで、どのタイプが本当の問題であるかがわかり、なぜ登録が行われなかったのかがわかりました。

于 2014-10-09T15:34:56.623 に答える