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 |
---|---|
Converts an ITextBuffer to an IVsTextBuffer. |
|
Converts an IVsTextBuffer to an ITextBuffer. |
|
Converts an IVsTextBuffer to an ITextBuffer. |
|
Converts an ITextView to an IVsTextView. |
|
Converts an IVsTextView to an IWpfTextView. |
Criar adaptadores
Use os seguintes métodos para criar adaptadores para interfaces de legado.
Método |
Conversão |
---|---|
Cria um IVsCodeWindow. |
|
Cria um IVsTextBuffer para um IContentType. |
|
Cria um IVsTextBuffer. |
|
Cria um IVsTextBufferCoordinator. |
|
Creates an IVsTextView for an ITextViewRoleSet. |
|
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
Adicione uma referência a Microsoft.VisualStudio.Editor.dll. Certifique-se de que CopyLocal for definido como false.
Criar uma instância de IVsEditorAdaptersFactoryService, da seguinte forma.
using Microsoft.VisualStudio.Editor; ... IVsEditorAdaptersFactoryService adapterFactoryService = ComponentModel.GetService<IVsEditorAdaptersFactoryService>();
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
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.
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
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.
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;
Instancie o modelo de componentes no método de inicialização do seu componente.
componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
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>();