在 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 之间
使用以下方法添加到编辑对象和传统接口之间切换。
方法 |
转换 |
---|---|
将 ITextBuffer 转换为 IVsTextBuffer。 |
|
将 IVsTextBuffer 转换为 ITextBuffer。 |
|
将 IVsTextBuffer 转换为 ITextBuffer。 |
|
将 ITextView 转换为 IVsTextView。 |
|
将 IVsTextView 转换为 IWpfTextView。 |
创建适配器
使用以下方法创建传统接口的适配器。
方法 |
转换 |
---|---|
创建一个 IVsCodeWindow。 |
|
创建指定的 IContentType的 IVsTextBuffer 。 |
|
创建一个 IVsTextBuffer。 |
|
创建一个 IVsTextBufferCoordinator。 |
|
为 ITextViewRoleSet 创建一个 IVsTextView。 |
|
创建一个 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 的适配器
添加对 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 可调用包装接口作为 IVx* 接口。 例如, Microsoft.VisualStudio.Platform.VSEditor.Interop.IVxTextBuffer 接口是 ITextBuffer 接口的 COM 版本。 从 IVxTextBuffer,可以向缓冲区的快照中的 get 访问,修改缓冲区,侦听缓冲区中的文本更改事件,并且,创建跟踪点和大小。 以下步骤演示如何访问从 IVsTextBuffer的 IVxTextBuffer 。
获取 IVxTextBuffer
IVx* 接口的定义在的 VSEditor.h 文件。 \VisualStudioIntegration\Common\Inc\ folder of the Visual Studio SDK 安装。
使用 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 组件的编辑元素
引用添加到的 Microsoft.VisualStudio.ComponentModelHost.dll 程序集。 \Common7\IDE\ folder of the Visual Studio 安装。 确保 CopyLocal 设置为 false。
如下方法添加一个私有 IComponentModel 成员添加到要使用 Visual Studio 编辑服务,的类。
using Microsoft.VisualStudio.ComponentModelHost; .... private IComponentModel componentModel;
实例化在初始化方法的组件模型元素的。
componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
在此之后,通过调用所需的服务的 IComponentModel.GetService<T>() 方法来获得任何一个 Visual Studio 版本服务。
textBufferFactoryService = componentModel.GetService<ITextBufferFactoryService>();