Managed Extensibility Framework en el editor

El editor se compila mediante componentes de Managed Extensibility Framework (MEF). Puede crear sus propios componentes MEF para ampliar el editor y el código también puede consumir componentes del editor.

MEF es una biblioteca de .NET que le permite agregar y modificar características de una aplicación o componente que sigue el modelo de programación MEF. El editor de Visual Studio puede proporcionar y consumir partes del componente MEF.

MeF se encuentra en el ensamblado System.ComponentModel.Composition.dll de .NET Framework versión 4.

Para obtener más información sobre MEF, vea Managed Extensibility Framework (MEF).

Componentes y contenedores de composición

Una parte de componente es una clase o un miembro de una clase que puede realizar una (o ambas) de las siguientes acciones:

  • Consumo de otro componente

  • Ser consumido por otro componente

    Por ejemplo, considere una aplicación de compra que tenga un componente de entrada de pedido que dependa de los datos de disponibilidad del producto proporcionados por un componente de inventario de almacenamiento. En términos MEF, la parte de inventario puede exportar los datos de disponibilidad del producto y la parte de entrada del pedido puede importar los datos. La parte de entrada del pedido y la parte de inventario no tienen que conocerse entre sí; el contenedor de composición (proporcionado por la aplicación host) es responsable de mantener el conjunto de exportaciones y resolver las exportaciones e importaciones.

    El contenedor de composición, CompositionContainer, normalmente es propiedad del host. El contenedor de composición mantiene un catálogo de elementos de componente exportados.

Exportación e importación de elementos de componentes

Puede exportar cualquier funcionalidad, siempre que se implemente como una clase pública o un miembro público de una clase (propiedad o método). No es necesario derivar la parte del componente de ComposablePart. En su lugar, debe agregar un ExportAttribute atributo a la clase o al miembro de clase que desea exportar. Este atributo especifica el contrato por el que otro elemento de componente puede importar la funcionalidad.

El contrato de exportación

ExportAttribute define la entidad (clase, interfaz o estructura) que se está exportando. Normalmente, el atributo export toma un parámetro que especifica el tipo de la exportación.

[Export(typeof(ContentTypeDefinition))]
class TestContentTypeDefinition : ContentTypeDefinition {   }

De forma predeterminada, el ExportAttribute atributo define un contrato que es el tipo de la clase de exportación.

[Export]
[Name("Structure")]
[Order(After = "Selection", Before = "Text")]
class TestAdornmentLayerDefinition : AdornmentLayerDefinition {   }

En el ejemplo, el atributo predeterminado [Export] es equivalente a [Export(typeof(TestAdornmentLayerDefinition))].

También puede exportar una propiedad o método, como se muestra en el ejemplo siguiente.

[Export]
[Name("Scarlet")]
[Order(After = "Selection", Before = "Text")]
public AdornmentLayerDefinition scarletLayerDefinition;

Importación de una exportación de MEF

Cuando desee consumir una exportación MEF, debe conocer el contrato (normalmente el tipo) por el que se exportó y agregar un ImportAttribute atributo que tenga ese valor. De forma predeterminada, el atributo import toma un parámetro, que es el tipo de la clase que modifica. Las siguientes líneas de código importan el IClassificationTypeRegistryService tipo.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Solución de problemas de importación y exportación: acceso al registro de errores de composición de MEF

Puede experimentar problemas si intenta importar algo que no existe en la instalación actual de VS o si crea incorrectamente la importación o exportación. La forma principal de buscar y solucionar estos problemas es hacer referencia al registro de errores de composición de Managed Extensibility Framework (MEF), almacenado en %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Obtención de la funcionalidad del editor de un elemento de componente MEF

Si el código existente es una parte de componente MEF, puede usar metadatos MEF para consumir elementos de componente del editor.

Para consumir la funcionalidad del editor de un elemento de componente MEF

  1. Agregue referencias a System.Composition.ComponentModel.dll, que se encuentra en la caché global de ensamblados (GAC) y a los ensamblados del editor.

  2. Agregue las directivas using pertinentes.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Agregue el [Import] atributo a la interfaz de servicio, como se indica a continuación.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Cuando haya obtenido el servicio, puede consumir cualquiera de sus componentes.

  5. Cuando haya compilado el ensamblado, colóquelo en *.. Carpeta \Common7\IDE\Components* de la instalación de Visual Studio.