Compartilhar via


Estrutura de Extensibilidade Gerenciada no editor

O editor é criado usando componentes do MEF (Managed Extensibility Framework). Você pode criar seus próprios componentes do MEF para estender o editor e seu código também pode consumir componentes do editor.

O MEF é uma biblioteca .NET que permite adicionar e modificar recursos de um aplicativo ou componente que segue o modelo de programação do MEF. O editor do Visual Studio pode fornecer e consumir partes do componente MEF.

O MEF está contido no assembly do .NET Framework versão 4 System.ComponentModel.Composition.dll .

Para obter mais informações sobre o MEF, consulte o MEF (Managed Extensibility Framework).

Partes de componente e contêineres de composição

Um componente é uma classe ou um membro de uma classe que pode realizar uma (ou ambas) das seguintes ações:

  • Consumir outro componente

  • Ser consumido por outro componente

    Por exemplo, considere um aplicativo de compras que tenha um componente de entrada de pedido que depende dos dados de disponibilidade do produto fornecidos por um componente de inventário de armazém. Em termos de MEF, a parte de inventário pode exportar dados de disponibilidade do produto e a parte de entrada do pedido pode importar os dados. A parte de entrada do pedido e a parte de inventário não precisam se conhecer; o contêiner de composição (fornecido pelo aplicativo host) é responsável por manter o conjunto de exportações e resolver as exportações e importações.

    O contêiner de composição, CompositionContainernormalmente, pertence ao host. O contêiner de composição mantém um catálogo de partes de componente exportadas.

Exportar e importar partes de componentes

Você pode exportar qualquer funcionalidade, desde que ela seja implementada como uma classe pública ou um membro público de uma classe (propriedade ou método). Você não precisa derivar o seu componente de ComposablePart. Em vez disso, você deve adicionar um ExportAttribute atributo à classe ou membro de classe que deseja exportar. Esse atributo especifica o contrato pelo qual outra parte do componente pode importar sua funcionalidade.

O contrato de exportação

Define ExportAttribute a entidade (classe, interface ou estrutura) que está sendo exportada. Normalmente, o atributo de exportação usa um parâmetro que especifica o tipo da exportação.

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

Por padrão, o ExportAttribute atributo define um contrato que é o tipo da classe de exportação.

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

No exemplo, o atributo padrão [Export] é equivalente a [Export(typeof(TestAdornmentLayerDefinition))].

Você também pode exportar uma propriedade ou método, conforme mostrado no exemplo a seguir.

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

Importar uma exportação do MEF

Quando você deseja consumir uma exportação mef, você deve saber o contrato (normalmente o tipo) pelo qual ele foi exportado e adicionar um ImportAttribute atributo que tenha esse valor. Por padrão, o atributo de importação usa um parâmetro, que é o tipo da classe que ele modifica. As linhas de código a seguir importam o IClassificationTypeRegistryService tipo.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Solução de problemas de importação/exportação: acessar o log de erros de composição do MEF

Você poderá enfrentar problemas se tentar importar algo que não existe na instalação atual do VS ou se criar incorretamente sua importação ou exportação. A principal maneira de localizar e resolver esses problemas é referenciar o Log de Erros de Composição do MEF (Managed Extensibility Framework), armazenado em %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Obter funcionalidade de editor de uma parte componente do MEF

Se o código existente for uma parte do componente MEF, você poderá usar metadados de MEF para consumir partes do componente do editor.

Para consumir a funcionalidade do editor de uma parte do componente MEF

  1. Adicione referências a System.Composition.ComponentModel.dll, que está no GAC (cache de assembly global) e aos assemblies do editor.

  2. Adicione as diretivas de uso relevantes.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Adicione o [Import] atributo à interface de serviço, da seguinte maneira.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Quando você tiver obtido o serviço, poderá consumir qualquer um de seus componentes.

  5. Quando você tiver compilado o assembly, coloque-o no *.. Pasta \Common7\IDE\Components* da instalação do Visual Studio.