No se puede obtener la exportación de parte

Estoy usando MEF para crear una arquitectura de estilo de complemento, pero obtengo una excepción de composición.

Aquí está el detalle.

Tengo el siguiente código:

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))
    {
    }
}

En la línea:

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

Recibo la siguiente excepción lanzada:

Excepción = {"La composición produjo un solo error de composición. La causa principal se proporciona a continuación. Revise la propiedad CompositionException.Errors para obtener información más detallada. 1) El subproceso de llamada debe ser STA, porque muchos componentes de la interfaz de usuario lo requieren.

Todo esto funcionaba, luego cambié mi complemento para heredar de la clase System.Windows.Window. ¿Podría esto estar causando la falla?

Aquí está el encabezado del complemento:

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

Donde GX3ClientPlugin extiende la clase System.Windows.Window.

Estoy bastante seguro de que esto es relevante, pero no lo entiendas por completo :) http://mef.codeplex.com/discussions/81717

Por favor, hágame saber qué otra información necesita.

preguntado el 03 de mayo de 12 a las 12:05

1 Respuestas

La excepción no está realmente relacionada con MEF, pero la lanza el constructor de una ventana WPF cuando MEF intenta crearla. Como dice la excepción, a las ventanas de WPF no les gusta que se creen en un subproceso que no sea STA.

Puedo pensar en dos razones diferentes por las que podría estar recibiendo este error:

1) Su subproceso principal no es un subproceso STA, porque el Main el punto de entrada de su aplicación no tiene el STASubproceso atributo.

2) Estás invocando ComposeParts en otro hilo que no es el hilo principal, y este otro hilo fue creado sin establecer el estado del apartamento a ApartmentState.STA.

Ver también esto otra pregunta.

contestado el 23 de mayo de 17 a las 11:05

Gracias, los comprobaré y me pondré en contacto con usted. user589195

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.