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 = {"合成产生了单个合成错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。1) 调用线程必须是 STA,因为许多 UI 组件都需要这个。

这一切正常,然后我将插件更改为从 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 相关的,而是由 WPF 窗口的构造函数在 MEF 尝试创建它时引发的。作为例外状态,WPF 窗口不喜欢在非 STA 线程上创建。

我可以想到您可能会收到此错误的两个不同原因:

1)您的主线程不是 STA 线程,因为Main您的应用程序的入口点没有STAThread属性。

2)您正在调用ComposeParts另一个不是主线程的线程,并且该另一个线程是在没有将单元状态设置为 的情况下创建的ApartmentState.STA

另请参阅this other question

于 2012-05-03T12:30:58.823 回答