Compartilhar via


Adaptando o código herdado para o novo Editor

O editor no Visual Studio 2010 oferece muitos recursos que você pode acessar de componentes de código existente. As instruções a seguir mostram como adaptar um componente não MEF, por exemplo, um VSPackage, consumir a funcionalidade do editor. As instruções também mostram como usar os adaptadores para obter os serviços do editor de código gerenciado e não gerenciado.

Adaptadores de editor

Adaptadores de editor ou correções, são invólucros para objetos do editor que também expõem as classes e interfaces na Microsoft.VisualStudio.TextManager.Interop API. Você pode usar os adaptadores para mover entre os serviços não-editor, por exemplo, comandos do shell de Visual Studio e serviços do editor. (Isso é como o editor esteja hospedado em Visual Studio). Adaptadores permitem também legadas extensões de serviços de editor e o idioma funcionar corretamente em Visual Studio 2010.

Uso de adaptadores de Editor

O IVsEditorAdaptersFactoryService fornece métodos que alternar entre as novas interfaces do editor e as interfaces de legado e também métodos que criar adaptadores.

Se você estiver usando esse serviço em uma parte do componente MEF, você pode importar o serviço da seguinte maneira.

[Import(typeof(IVsEditorAdaptersFactoryService))]
internal IVsEditorAdaptersFactoryService editorFactory;

Se você quiser usar esse serviço em um componente não MEF, siga as instruções na seção "Usando Visual Studio serviços em um não-MEF componente Editor" neste tópico.

Alternando entre a nova API de Editor e a API Legacy

Use os seguintes métodos para alternar entre um objeto de editor e uma interface legacy.

Método

Conversão

GetBufferAdapter

Converts an ITextBuffer to an IVsTextBuffer.

GetDataBuffer

Converts an IVsTextBuffer to an ITextBuffer.

GetDocumentBuffer

Converts an IVsTextBuffer to an ITextBuffer.

GetViewAdapter

Converts an ITextView to an IVsTextView.

GetWpfTextView

Converts an IVsTextView to an IWpfTextView.

Criar adaptadores

Use os seguintes métodos para criar adaptadores para interfaces de legado.

Método

Conversão

CreateVsCodeWindowAdapter

Cria um IVsCodeWindow.

CreateVsTextBufferAdapter

Cria um IVsTextBuffer para um IContentType.

CreateVsTextBufferAdapter

Cria um IVsTextBuffer.

CreateVsTextBufferCoordinatorAdapter

Cria um IVsTextBufferCoordinator.

CreateVsTextViewAdapter

Creates an IVsTextView for an ITextViewRoleSet.

CreateVsTextViewAdapter

Cria um IVsTextView.

Criar adaptadores em código não gerenciado

Todas as classes de adaptador estão registradas para ser local co-creatable e pode ser instanciada, usando o VsLocalCreateInstance() função.

Todos os adaptadores são criados usando os GUIDs que são definidos no arquivo vsshlids.h na.. A pasta \VisualStudioIntegration\Common\Inc\ da instalação do SDK do Visual Studio. Para criar uma instância de VsTextBufferAdapter, use o código a seguir.

IVsTextBuffer *pBuf = NULL;
VsLocalCreateInstance(CLSID_VsTextBuffer, NULL, CLSCTX_INPROC_SERVER, IID_IVsTextBuffer, (void**)&pBuf);

Criar adaptadores no código gerenciado

No código gerenciado, você pode co-criar os adaptadores da mesma forma descrita para código não gerenciado. Você também pode usar um serviço MEF que permite criar e interagir com os adaptadores. Dessa maneira de obter um adaptador permite controle mais minucioso que quando você co-criá-lo.

Para criar um adaptador para IVsTextView

  1. Adicione uma referência a Microsoft.VisualStudio.Editor.dll. Certifique-se de que CopyLocal for definido como false.

  2. Criar uma instância de IVsEditorAdaptersFactoryService, da seguinte forma.

    using Microsoft.VisualStudio.Editor;
    ...
    IVsEditorAdaptersFactoryService adapterFactoryService = ComponentModel.GetService<IVsEditorAdaptersFactoryService>();
    
  3. Chame o método CreateX().

    adapterFactoryService.CreateTextViewAdapter(textView);
    

Usando o Editor de Visual Studio diretamente a partir do código não gerenciado

O namespace Microsoft.VisualStudio.Platform.VSEditor e o namespace Microsoft.VisualStudio.Platform.VSEditor.Interop expõem interfaces COM-callable como interfaces de IVx *. Por exemplo, a interface Microsoft.VisualStudio.Platform.VSEditor.Interop.IVxTextBuffer é a versão COM o ITextBuffer interface. Da IVxTextBuffer, obter acesso a esses snapshots de buffer, modificar o buffer, ouvir os eventos de alteração de texto no buffer e criar pontos de controle e distribuições. As seguintes etapas mostram como acessar uma IVxTextBuffer de um IVsTextBuffer.

Para obter um IVxTextBuffer

  1. As definições para as interfaces IVx * estão no arquivo VSEditor.h na.. A pasta \VisualStudioIntegration\Common\Inc\ da instalação do SDK do Visual Studio.

  2. O código a seguir instancia um buffer de texto usando o IVsUserData->GetData() método. No código a seguir, pData é um ponteiro para um IVsUserData objeto.

    #include <textmgr.h>
    #include <VSEditor.h>
    #include <vsshlids.h>
    
    CComPtr<IVsTextBuffer> pVsTextBuffer;
    CComPtr<IVsUserData> pData;
    CComPtr<IVxTextBuffer> pVxBuffer;
    ...
    if (SUCCEEDED(pVsTextBuffer->QueryInterface(IID_IVsUserData, &pData))
    {
        CComVariant vt;
        if (SUCCEEDED(pData->GetData(GUID_VxTextBuffer, &vt)) &&
        (vt.Type == VT_UNKNOWN) && (vt.punkVal != NULL))
        {
            vt.punkVal->QueryInterface(IID_IVxTextBuffer, (void**)&pVxBuffer);
        }
    }
    

Usando o Editor de Visual Studio Services em um componente não MEF

Se você tiver um componente existente de código gerenciado que não use MEF e você deseja usar os serviços do editor de Visual Studio, você deve adicionar uma referência ao assembly que contém o ComponentModelHost VSPackage e obtenha o seu serviço de SComponentModel.

Para consumir os componentes do editor de Visual Studio de um componente não MEF

  1. Adicione uma referência ao assembly Microsoft.VisualStudio.ComponentModelHost.dll na.. A pasta \Common7\IDE\ da instalação do Visual Studio. Certifique-se de que CopyLocal for definido como false.

  2. Adicionar um private IComponentModel membro à classe na qual você deseja usar os serviços do editor de Visual Studio, da seguinte maneira.

    using Microsoft.VisualStudio.ComponentModelHost;
    ....
    private IComponentModel componentModel;
    
  3. Instancie o modelo de componentes no método de inicialização do seu componente.

    componentModel =
     (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
    
  4. Depois disso, você pode obter qualquer um dos serviços de Visual Studio editor chamando o IComponentModel.GetService<T>() método para o serviço desejado.

    textBufferFactoryService =
         componentModel.GetService<ITextBufferFactoryService>();