5

.net-4.0 の System.ComponentModel.Composition を使用して、Visual Studio 2010 ベータ 2 で初めて Managed Extensibility Framework を試しています。

以下の 2 つの代替ルーチンを使用して、CompositionContainer が実装アセンブリを見つけることができませんでした。

最初の試行 (これは MEF の古い codeplex リリースで機能しました):

var composition = new CompositionBatch();
composition.AddPart(this);
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
container.Compose(composition);

2回目の試み(これはベータ1で機能したと思います):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()),
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
var compositionContainer = new CompositionContainer(aggregateCatalog);
compositionContainer.ComposeParts(this);

ベータ 2 でこれを行う新しい方法はありますか?

編集:構成とは何の関係もないことが判明しました。インポートした実装を表す静的プロパティがありました。

[Import] public static ILog Log { get; set; }

あるべきだった:

[Import] public ILog Log { get; set; }

より徹底的な方法でデバッグするという賢明なアドバイスが問題を解決したため、ダニエルの回答を受け入れたものとしてマークしました。

4

2 に答える 2

1

何が失敗していますか?満たされていると期待されているが、満たされていないインポートはありますか? GetExports() を呼び出していますが、失敗していますか?

カタログが作成された後、デバッガーを中断し、aggregateCatalog 変数の上にマウスを置いて検査し、どの部分が含まれているかを確認できます。私の推測では、パーツはおそらくカタログにあり、問題はコードの別の場所にあると思われます。考えられる原因は、[ImportMany] ではなく [Import] 属性を使用しているコレクション インポートがあるか、満たすことができないインポートがあるためにパーツが拒否されていることです。

于 2009-11-17T16:20:33.630 に答える
0

SoapBox Core Hostの Compose メソッドを見てみると、 DirectoryCatalog を使用してディレクトリ内のすべての部分を見つけることができます。ただし、これは .NET 4 に対してコンパイルされたものではなく、MEF のプレビュー リリースに対してのみコンパイルされます。

    private bool Compose()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new DirectoryCatalog("."));

        _container = new CompositionContainer(catalog);

        try
        {
            _container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            MessageBox.Show(compositionException.ToString());
            return false;
        }
        return true;
    }
于 2009-11-18T01:14:09.537 に答える