1

よろしくお願いします。次のエクスポートされた部分があります。

[Export (typeof(INewComponent))]  // orignally tried just [Export} here and importing NewComponent below
public class NewComponent : INewComponent  
{  
    // does stuff including an import  
}

コンソールテストプログラムは、上記をインポートします。

public class Program   
{    

    [Import]  // have tried variations on importing "NewComponent NewComponent" etc  
    public INewComponent NewComponent
    {
        get;
        set;
    }

    public static void Main(string[] args)
    {
        var p = new Program();
        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        var container = new CompositionContainer(catalog);
        container.ComposeParts(p);
}

コンポジションはこれらのCompositionExceptionsで失敗します(有罪を保護するために名前空間を削除しました:)):

1)制約に一致する有効なエクスポートが見つかりませんでした'((exportDefinition.ContractName == "INewComponent")AndAlso(exportDefinition.Metadata.ContainsKey( "ExportTypeIdentity")AndAlso "INewComponent" .Equals(exportDefinition.Metadata.get_Item( "ExportTypeIdentity "))))'、無効なエクスポートが拒否された可能性があります。

次のようにメインプログラムでコンポジションを実行すると、コンポジションは正常に機能します。

public class Program  
{      

    public static void Main(string[] args)
    {
        INewComponent newComponent = new NewComponent();

        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        var container = new CompositionContainer(catalog);
        container.ComposeParts(newComponent);
    }
}

ありがとうございました

4

2 に答える 2

3

エクスポートされたパーツはと同じアセンブリに含まれていProgramますか?別のDLLにある場合は、次のように、そのアセンブリもカタログに含める必要があります。

var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(NewComponent).Assembly));
var container = new CompositionContainer(aggregateCatalog);
// etc...

それでもうまくいかない場合は、カタログの分析に役立つVisualMEFxと呼ばれる優れたオープンソースツールがあります。設定に関する短い記事は次のとおりです。

VisualMEFx入門

于 2012-06-25T13:03:26.983 に答える
2

あなたのNewComponentクラスであなたはこれを書きました:

// does stuff including an import

表示されていないインポートに問題がある場合、MEFはProgram.NewComponent、実際のより深い原因ではなく、インポートについて文句を言います。これを「安定構成」といいます。安定したコンポジションは便利です、失敗したコンポジションのデバッグも複雑になります。

構成エラーの診断に関するMEFドキュメントの指示に従って、実際の原因を突き止めることができます。

小さなプログラムでcontainer.GetExportedValue<ISomeExport>()は、問題の原因となっているものが見つかるまで、いくつかのエクスポートを呼び出すこともできます。

于 2012-06-25T13:21:06.603 に答える