Адаптация прежний к новому редактором кода
Редактор 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 прежних версий
Используйте следующие методы для переключения между объектом интерфейсом редактора и устаревшим.
Метод |
Преобразование |
---|---|
Преобразовывает объект ITextBuffer в IVsTextBuffer. |
|
Преобразовывает объект IVsTextBuffer в ITextBuffer. |
|
Преобразовывает объект IVsTextBuffer в ITextBuffer. |
|
Преобразовывает объект ITextView в IVsTextView. |
|
Преобразовывает объект IVsTextView в IWpfTextView. |
Создание адаптеров
Используйте следующие методы для создания адаптеров для традиционных интерфейсов.
Метод |
Преобразование |
---|---|
Создает объект IVsCodeWindow. |
|
Создание IVsTextBuffer для указанного IContentType. |
|
Создает объект IVsTextBuffer. |
|
Создает объект IVsTextBufferCoordinator. |
|
Создает IVsTextView для ITextViewRoleSet. |
|
Создает объект 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
Добавьте ссылку на Microsoft.VisualStudio.Editor.dll. Убедитесь, что CopyLocal равно false.
Создайте экземпляр IVsEditorAdaptersFactoryServiceследующим образом.
using Microsoft.VisualStudio.Editor; ... IVsEditorAdaptersFactoryService adapterFactoryService = ComponentModel.GetService<IVsEditorAdaptersFactoryService>();
Вызовите метод 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
Определения интерфейсов в файле VSEditor.h в IVx*. \ \ VisualStudioIntegration общее \ Inc \ папку установки пакета SDK для Visual Studio.
Следующие создает текстовый буфер с помощью кода 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
Добавьте ссылку на сборку в Microsoft.VisualStudio.ComponentModelHost.dll. \ Common7 \ ide \ папка установки Visual Studio. Убедитесь, что CopyLocal равно false.
Добавьте закрытое IComponentModel элемент к классу, в котором необходимо использовать службы редактора Visual Studio следующим образом.
using Microsoft.VisualStudio.ComponentModelHost; .... private IComponentModel componentModel;
Создайте экземпляр модели компонентов в методе инициализации компонента.
componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
Затем можно получить одну из редактора Visual Studio путем вызова служб IComponentModel.GetService<T>() метод службы.
textBufferFactoryService = componentModel.GetService<ITextBufferFactoryService>();