满足旧代码的新编辑器

在 Visual Studio 2010的编辑器提供可以从现有代码元素的许多功能。 下面的命令演示如何改编非 MEF 组件,例如, VSPackage 中,使用编辑功能。 命令还演示如何使用适配器通过编辑的服务在托管和非托管代码的。

编辑适配器

编辑适配器或填充,同时显示类和接口。 Microsoft.VisualStudio.TextManager.Interop API 的编辑对象的包装。 可以使用适配器将在非编辑服务之间例如, Visual Studio shell 命令和编辑服务。 (这是编辑器如何在 Visual Studio 当前承载。)适配器。 Visual Studio 2010还使旧编辑和语言服务扩展正常工作。

使用编辑器适配器

IVsEditorAdaptersFactoryService 中提供新的编辑接口和旧接口之间切换,并且方法创建适配器的方法。

如果在 MEF 组件部件使用此服务,可以按如下方式导入服务。

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

如果您在非 MEF 组件若要使用此服务,请按照中的说明 “使用 Visual Studio 在非 MEF 组件”部分中的编辑服务本主题。

切换在新编辑 API 和传统 API 之间

使用以下方法添加到编辑对象和传统接口之间切换。

方法

转换

GetBufferAdapter

ITextBuffer 转换为 IVsTextBuffer

GetDataBuffer

IVsTextBuffer 转换为 ITextBuffer

GetDocumentBuffer

IVsTextBuffer 转换为 ITextBuffer

GetViewAdapter

ITextView 转换为 IVsTextView

GetWpfTextView

IVsTextView 转换为 IWpfTextView

创建适配器

使用以下方法创建传统接口的适配器。

方法

转换

CreateVsCodeWindowAdapter

创建一个 IVsCodeWindow

CreateVsTextBufferAdapter

创建指定的 IContentTypeIVsTextBuffer

CreateVsTextBufferAdapter

创建一个 IVsTextBuffer

CreateVsTextBufferCoordinatorAdapter

创建一个 IVsTextBufferCoordinator

CreateVsTextViewAdapter

ITextViewRoleSet 创建一个 IVsTextView

CreateVsTextViewAdapter

创建一个 IVsTextView

创建适配器在非托管代码

使用 VsLocalCreateInstance() 函数外,所有适配器类注册是本地计算机上创建,并实例化。

在的 vsshlids.h 文件中定义的所有适配器上创建使用 GUID。 \VisualStudioIntegration\Common\Inc\ folder of the Visual Studio SDK 安装。 若要创建 VsTextBufferAdapter 实例,请使用下面的代码。

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

创建适配器在托管代码

在托管代码中,可以与封送到非托管代码描述的那样共同创建适配器。 还可以使用允许您使用适配器创建并进行交互的 MEF 服务。 获取适配器此方式与您在启用更精细的控制何时共同创建它。

创建 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 可调用包装接口作为 IVx* 接口。 例如, Microsoft.VisualStudio.Platform.VSEditor.Interop.IVxTextBuffer 接口是 ITextBuffer 接口的 COM 版本。 从 IVxTextBuffer,可以向缓冲区的快照中的 get 访问,修改缓冲区,侦听缓冲区中的文本更改事件,并且,创建跟踪点和大小。 以下步骤演示如何访问从 IVsTextBufferIVxTextBuffer

获取 IVxTextBuffer

  1. IVx* 接口的定义在的 VSEditor.h 文件。 \VisualStudioIntegration\Common\Inc\ folder of the Visual Studio SDK 安装。

  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 在非 MEF 组件的编辑服务

如果存在未使用 MEF,然后的现有托管代码元素要使用 Visual Studio 编辑的服务,必须添加对包含 ComponentModelHost VSPackage 和获取其 SComponentModel 服务的程序集。

使用 Visual Studio 从非 MEF 组件的编辑元素

  1. 引用添加到的 Microsoft.VisualStudio.ComponentModelHost.dll 程序集。 \Common7\IDE\ folder of the Visual Studio 安装。 确保 CopyLocal 设置为 false。

  2. 如下方法添加一个私有 IComponentModel 成员添加到要使用 Visual Studio 编辑服务,的类。

    using Microsoft.VisualStudio.ComponentModelHost;
    ....
    private IComponentModel componentModel;
    
  3. 实例化在初始化方法的组件模型元素的。

    componentModel =
     (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
    
  4. 在此之后,通过调用所需的服务的 IComponentModel.GetService<T>() 方法来获得任何一个 Visual Studio 版本服务。

    textBufferFactoryService =
         componentModel.GetService<ITextBufferFactoryService>();