Поделиться через


Адаптация прежний к новому редактором кода

Редактор in Visual Studio 2010 предлагает большое количество функций, которые можно получить доступ из существующих компонентов кода. Следующие инструкции показывают, как адаптировать non-MEF компонента, например VSPackage к функциональности редактора потребления. Инструкции также показано, как использовать адаптеры для получения службы редактора и в управляемый, так и неуправляемый код.

Адаптеров редактора

Адаптеров редактора или оболочки, программы-оболочки для объектов редактора, также предоставляют классы и интерфейсы Microsoft.VisualStudio.TextManager.Interop API. Можно использовать адаптеры для перемещения между службами non-редактора например, оболочки Visual Studio команды и службы редактора. (Это называется редактор в настоящий момент размещается в Visual Studio.) Адаптеры также позволяют выполнять традиционные расширения редактора и службы языка для правильной работы in Visual Studio 2010.

С помощью адаптеров редактора

IVsEditorAdaptersFactoryService предоставляет методы, переключают между новыми интерфейсами редактора и традиционное письмо интерфейсами, а также методы, которые создают адаптеры.

При использовании этой службы из частей MEF компонента, можно импортировать служба следующим образом.

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

Если необходимо использовать эту службу в компоненте non-MEF, то следуйте инструкциям в разделе "использование службы редактора Visual Studio в разделе Non-MEF компонента" далее в этом разделе.

Переключение между новым API редактора и API прежних версий

Используйте следующие методы для переключения между объектом интерфейсом редактора и устаревшим.

Метод

Преобразование

GetBufferAdapter

Преобразовывает объект ITextBuffer в IVsTextBuffer.

GetDataBuffer

Преобразовывает объект IVsTextBuffer в ITextBuffer.

GetDocumentBuffer

Преобразовывает объект IVsTextBuffer в ITextBuffer.

GetViewAdapter

Преобразовывает объект ITextView в IVsTextView.

GetWpfTextView

Преобразовывает объект IVsTextView в IWpfTextView.

Создание адаптеров

Используйте следующие методы для создания адаптеров для традиционных интерфейсов.

Метод

Преобразование

CreateVsCodeWindowAdapter

Создает объект IVsCodeWindow.

CreateVsTextBufferAdapter

Создание IVsTextBuffer для указанного IContentType.

CreateVsTextBufferAdapter

Создает объект IVsTextBuffer.

CreateVsTextBufferCoordinatorAdapter

Создает объект IVsTextBufferCoordinator.

CreateVsTextViewAdapter

Создает IVsTextView для ITextViewRoleSet.

CreateVsTextViewAdapter

Создает объект IVsTextView.

Создание адаптеров в неуправляемом коде

Все классы адаптеров зарегистрированы, чтобы указать локальный co-creatable и могут быть создан с помощью VsLocalCreateInstance() функция.

Все адаптеры создаются с помощью идентификатора GUID, определенные в файле vsshlids.h в. \ \ VisualStudioIntegration общее \ Inc \ папку установки пакета SDK для Visual Studio. Чтобы создать экземпляр VsTextBufferAdapter используйте следующий код.

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

Создание адаптеров в управляемом коде

В управляемом коде, можно co-создать адаптеры точно так же, как и то, описанное для неуправляемого кода). Можно также использовать службу MEF, которая позволяет создавать и взаимодействовать с адаптером. Этот способ получения адаптер обеспечивает более тонкозернистый элемент управления не будет получена после co-создадите его.

Создание адаптера для IVsTextView

  1. Добавьте ссылку на Microsoft.VisualStudio.Editor.dll. Убедитесь, что CopyLocal равно false.

  2. Создайте экземпляр IVsEditorAdaptersFactoryServiceследующим образом.

    using Microsoft.VisualStudio.Editor;
    ...
    IVsEditorAdaptersFactoryService adapterFactoryService = ComponentModel.GetService<IVsEditorAdaptersFactoryService>();
    
  3. Вызовите метод CreateX().

    adapterFactoryService.CreateTextViewAdapter(textView);
    

Использование редактора Visual Studio непосредственно из неуправляемого кода

Пространство имен Microsoft.VisualStudio.Platform.VSEditor и пространство имен Microsoft.VisualStudio.Platform.VSEditor.Interop предоставляют Модель COM-callable интерфейсы интерфейсы IVx*. Например, интерфейс Microsoft.VisualStudio.Platform.VSEditor.Interop.IVxTextBuffer версия модели COM ITextBuffer интерфейс. От IVxTextBufferможно получить доступ к моментальным снимкам буфера, изменения буфер, прослушивание событий текст-изменения в буфер и создание точки и диапазоны отслеживания. Следующие шаги показывают, как получить доступ IVxTextBuffer from a IVsTextBuffer.

Для получения IVxTextBuffer

  1. Определения интерфейсов в файле VSEditor.h в IVx*. \ \ VisualStudioIntegration общее \ Inc \ папку установки пакета SDK для Visual Studio.

  2. Следующие создает текстовый буфер с помощью кода IVsUserData->GetData() метод. В следующем коде pData указатель на IVsUserData объект.

    #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);
        }
    }
    

Использование службы редактора Visual Studio в компоненте Non-MEF

Если имеется существующий компонент управляемого кода, который не использует MEF и хотите использовать службы редактора Visual Studio, необходимо добавить ссылку на сборку, содержащую ComponentModelHost VSPackage и получить его обслуживание SComponentModel.

Использовать компоненты редактора Visual Studio из компонента non-MEF

  1. Добавьте ссылку на сборку в Microsoft.VisualStudio.ComponentModelHost.dll. \ Common7 \ ide \ папка установки Visual Studio. Убедитесь, что CopyLocal равно false.

  2. Добавьте закрытое IComponentModel элемент к классу, в котором необходимо использовать службы редактора Visual Studio следующим образом.

    using Microsoft.VisualStudio.ComponentModelHost;
    ....
    private IComponentModel componentModel;
    
  3. Создайте экземпляр модели компонентов в методе инициализации компонента.

    componentModel =
     (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
    
  4. Затем можно получить одну из редактора Visual Studio путем вызова служб IComponentModel.GetService<T>() метод службы.

    textBufferFactoryService =
         componentModel.GetService<ITextBufferFactoryService>();