Compartilhar via


Estrutura de Extensibilidade Gerenciada no editor

O editor é criado usando componentes do Managed Extensibility Framework (MEF). Você pode criar seus próprios componentes 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 MEF. O editor do Visual Studio pode fornecer e consumir partes do componente MEF.

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

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

Componentes e recipientes de composição

Uma parte do componente é uma classe ou um membro de uma classe que pode executar um (ou ambos) do seguinte:

  • Consumir outro componente

  • Ser consumido por outro componente

    Por exemplo, considere um aplicativo de compras que tenha um componente de entrada de pedido que dependa dos dados de disponibilidade do produto fornecidos por um componente de estoque de depósito. Em termos de MEF, a parte de estoque pode exportar dados de disponibilidade do produto e a parte de entrada do pedido pode importar os dados. A parte de entrada de pedidos e a parte de estoque 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 peças de componentes exportadas.

Exportar e importar peças componentes

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

O contrato de exportação

O ExportAttribute define a entidade (classe, interface ou estrutura) que está sendo exportada. Normalmente, o atributo export usa um parâmetro que especifica o tipo de 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 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 import 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: acesse o log de erros de composição do MEF

Você pode ter 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 é fazer referência ao Log de Erros de Composição do MEF (Managed Extensibility Framework), armazenado em %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Obter funcionalidade do editor de uma parte do componente MEF

Se o código existente for uma parte do componente MEF, você poderá usar metadados 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 cache de assembly global (GAC), 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 à sua interface de serviço, da seguinte maneira.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Depois de obter o serviço, você pode consumir qualquer um de seus componentes.

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