0

MEF を使用してプラグイン スタイルのアーキテクチャを作成していますが、合成例外が発生します。

詳細はこちら。

次のコードがあります。

AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(pluginDirectory));
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);

// add to dictionary
foreach (Lazy<IGX3PluginInterface> plugin in plugins)
{
    if (!this.pluginDictionary.ContainsKey(plugin.Value.ModuleName))
    {
    }
}

行上:

if (!this.pluginDictionary.ContainsKey(plugin.Value.ModuleName))

次の例外がスローされます。

Exception = {"コンポジションで 1 つのコンポジション エラーが発生しました。根本的な原因を以下に示します。詳細については、CompositionException.Errors プロパティを確認してください。1) 多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA である必要があります。

これはすべて機能していたので、プラグインを System.Windows.Window クラスから継承するように変更しました。これが失敗の原因になっている可能性はありますか?

プラグインのヘッダーは次のとおりです。

[Export(typeof(IGX3PluginInterface))]
public partial class MainWindow : GX3ClientPlugins.GX3ClientPlugin

GX3ClientPlugin は System.Windows.Window クラスを拡張します。

これは関連性があると確信していますが、完全には理解していません:) http://mef.codeplex.com/discussions/81717

他に必要な情報を教えてください。

4

1 に答える 1

2

この例外は、実際には MEF 関連ではありませんが、MEF が WPF ウィンドウを作成しようとしたときに、WPF ウィンドウのコンストラクターによってスローされます。例外として、WPF ウィンドウは非 STA スレッドで作成されることを好みません。

このエラーが発生する理由として、次の 2 つが考えられます。

Main1)アプリケーションのエントリ ポイントにSTAThread属性がないため、メイン スレッドは STA スレッドではありません。

ComposeParts2)メイン スレッドではない別のスレッドで呼び出しています。この別のスレッドは、アパートメント状態を に設定せずに作成されましたApartmentState.STA

この他の質問も参照してください。

于 2012-05-03T12:30:58.823 に答える