Anpassung des Legacy-Codes dem neuen Editor
Der Editor in Visual Studio 2010 bietet zahlreiche Features, die Sie von den vorhandenen Code Komponenten zugreifen können. Die folgenden Anweisungen zeigen, wie eine Nicht MEF Komponente anpasst, z. B. Editor, um ein VSPackage Funktionen zu nutzen. Die Anweisungen wird auch gezeigt, wie Adapter verwendet, um die Dienste des Editors in verwaltetem und nicht verwaltetem Code abzurufen.
Editor-Adapter
Editor Shime oder Netzwerkkarten sind Wrapper für den Editor Objekte, die auch die Klassen und Schnittstellen im Microsoft.VisualStudio.TextManager.Interop APIs verfügbar machen. Sie können die Adapter verwenden, um zwischen Nicht Editor Dienste zu wechseln, z. B. Visual Studio-Shellbefehle Editor und Dienste. (Dies wird wie der Editor nur in Visual Studio) gehostet wird. Adapter ermöglichen außerdem Legacy Editor und Verbesserungen in Visual Studio 2010Sprachdienst, um ordnungsgemäß zu funktionieren.
Verwenden von Editor-Adapter
IVsEditorAdaptersFactoryService stellt Methoden bereit, die zwischen der neuen Editor Schnittstellen und Legacy wechseln, Schnittstellen und Methoden, die auch Adapter erstellen.
Wenn Sie diesen Dienst in einem MEF-Komponenten-Teil verwenden, können Sie den Dienst wie folgt importieren.
[Import(typeof(IVsEditorAdaptersFactoryService))]
internal IVsEditorAdaptersFactoryService editorFactory;
Wenn Sie diesen Dienst in einer Komponente Nicht MEF verwenden möchten, befolgen Sie die Anweisungen unter „Using Visual Studio-Editor-Dienste in einem Abschnitt“ Abschnitt Nicht-MEF weiter unten in diesem Thema.
Wechsel zwischen dem neuen Editor APIs und dem Legacy API
Verwenden Sie die folgenden Methoden, um zwischen einem Editor Objekt und eine Legacy Oberfläche zu wechseln.
Methode |
Conversion |
---|---|
Konvertiert ein ITextBuffer in ein IVsTextBuffer. |
|
Konvertiert ein IVsTextBuffer in ein ITextBuffer. |
|
Konvertiert ein IVsTextBuffer in ein ITextBuffer. |
|
Konvertiert ein ITextView in ein IVsTextView. |
|
Konvertiert ein IVsTextView in ein IWpfTextView. |
Erstellen von Adaptern
Verwenden Sie die folgenden Methoden, um Adapter für Legacy Schnittstellen zu erstellen.
Methode |
Conversion |
---|---|
Erstellt eine IVsCodeWindow. |
|
Erstellt IVsTextBuffer für einen angegebenen IContentType. |
|
Erstellt eine IVsTextBuffer. |
|
Erstellt eine IVsTextBufferCoordinator. |
|
Erstellt einen IVsTextView für einen ITextViewRoleSet. |
|
Erstellt eine IVsTextView. |
Adapter in nicht verwaltetem Code
Die Adapterklassen werden registriert sein, um einen lokalen CO-erstellbares und können instanziiert werden, indem die VsLocalCreateInstance()-Funktion verwendet.
Alle Adapter werden erstellt, indem die GUID verwendet, das in der vsshlids.h-Datei im Ordner " definiert werden. \ VisualStudioIntegration \ Common \ Inc. \ der SDK-Installation Visual Studio. Um eine Instanz von VsTextBufferAdapter zu erstellen, verwenden Sie den folgenden Code.
IVsTextBuffer *pBuf = NULL;
VsLocalCreateInstance(CLSID_VsTextBuffer, NULL, CLSCTX_INPROC_SERVER, IID_IVsTextBuffer, (void**)&pBuf);
Adapter in verwaltetem Code erstellen
In verwaltetem Code können Sie die Adapter auf die gleiche Weise wie beteiligt ist. den für nicht verwalteten Code beschrieben wird. Sie können einen MEF-Dienst auch zum Erstellen und Adaptern mit der Sie interagieren können. Diese Möglichkeit zum Abrufen eines Adapters können eine präzisere Steuerung, als Sie haben, wenn Sie sie erstellen beteiligt ist.
So erstellen Sie einen Adapter für IVsTextView
Fügen Sie einen Verweis auf Microsoft.VisualStudio.Editor.dll hinzu. Überprüfen Sie, ob CopyLocal zu falsefestgelegt ist.
Instanziieren Sie wie folgt IVsEditorAdaptersFactoryService.
using Microsoft.VisualStudio.Editor; ... IVsEditorAdaptersFactoryService adapterFactoryService = ComponentModel.GetService<IVsEditorAdaptersFactoryService>();
Rufen Sie die CreateX()-Methode auf.
adapterFactoryService.CreateTextViewAdapter(textView);
Verwenden von Visual Studio-Editors direkt aus nicht verwaltetem Code
Der Microsoft.VisualStudio.Platform.VSEditor-Namespace und der Microsoft.VisualStudio.Platform.VSEditor.Interop-Namespace verfügbar machen COM-aufrufbare Schnittstellen als IVx*-Schnittstellen. Beispielsweise ist die Microsoft.VisualStudio.Platform.VSEditor.Interop.IVxTextBuffer-Schnittstelle die COM-Version der ITextBuffer-Schnittstelle. Von IVxTextBufferkönnen Sie den Zugriff auf den Puffer momentaufnahmen abrufen, den Puffer ändern, TEXT auf Ereignisse im Puffer Änderung und die Nachverfolgung überwachen, zeigt und - spannen erstellen. Die folgenden Schritte zeigen, wie IVxTextBuffer von IVsTextBufferzugreift.
So fügen Sie ein IVxTextBuffer abrufen
Die Definitionen für die IVx*-Schnittstellen sind in der VSEditor.h-Datei im Ordner "… \ VisualStudioIntegration \ Common \ Inc. \ der SDK-Installation Visual Studio.
Der folgende Code instanziiert einen Textpuffer, indem er die IVsUserData->GetData()-Methode. Im folgenden Code ist pData ein Zeiger auf ein IVsUserData-Objekt.
#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); } }
Verwenden von Visual Studio-Editor-Dienste in einer Komponente Nicht-MEF
Wenn Sie eine vorhandene Komponente für verwalteten Code nicht MEF verwendet, und Sie möchten die Dienste von Visual Studio-Editors verwenden, müssen Sie einen Verweis auf die Assembly hinzufügen, die die ComponentModelHost VSPackage enthält und rufen seinen SComponentModel-Dienst ab.
So führen Sie Visual Studio-Editor Komponenten von einer Komponente Nicht MEF profitieren
Fügen Sie einen Verweis auf die Microsoft.VisualStudio.ComponentModelHost.dll-Assembly im Ordner " hinzu. \ Common7 \ IDE \ der Visual Studio-Installation. Überprüfen Sie, ob CopyLocal zu falsefestgelegt ist.
Fügen Sie einen privaten IComponentModel-Member der Klasse, in der Sie Visual Studio-Editor Dienste verwenden möchten, wie folgt hinzu.
using Microsoft.VisualStudio.ComponentModelHost; .... private IComponentModel componentModel;
Instanziieren Sie das Modell der Teil in der Initialisierungsmethode für die Komponente.
componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
Danach können Sie eine der Visual Studio-Editor Dienste abrufen, indem Sie die IComponentModel.GetService<T>()-Methode für den Dienst aufrufen, den Sie verwenden möchten.
textBufferFactoryService = componentModel.GetService<ITextBufferFactoryService>();