无法从部分出口

时间:2012-05-03 11:38:12

标签: c# .net exception-handling mef

我正在使用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组件都需要这个。< / p>

这一切都正常,然后我改变了我的插件继承System.Windows.Window类。这会导致失败吗?

继承插件标题:

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

GX3ClientPlugin扩展System.Windows.Window类。

我很确定这是相关的,但不要完全理解它:) http://mef.codeplex.com/discussions/81717

请告诉我您需要的其他信息?

1 个答案:

答案 0 :(得分:2)

该异常与MEF无关,但是当MEF尝试创建它时,由WPF窗口的构造函数抛出。正如异常所述,WPF窗口不喜欢在非STA线程上创建。

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

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

2)您正在另一个不是主线程的线程上调用ComposeParts,而另一个线程是在没有setting the apartment stateApartmentState.STA的情况下创建的。

另见other question