레거시 코드를 새 편집기 도입
편집기에서 Visual Studio 2010 에서 기존 코드 구성 요소에 액세스할 수 있는 다양 한 기능을 제공 합니다. 다음 지침은 MEF 구성 요소 편집기 기능을 사용 하려면 VSPackage, 예를 들어, 적용 하는 방법을 보여 줍니다. 지시 또한 편집기의 서비스 관리 대상 및 관리 되지 않는 코드를 가져올 수 어댑터를 사용 하는 방법을 보여 줍니다.
편집기 어댑터
편집기 어댑터 또는 shim을 뿐만 아니라 클래스 및 인터페이스를 노출 하는 편집기 개체에 대 한 래퍼 되는 Microsoft.VisualStudio.TextManager.Interop API입니다. 예를 들어 편집기 서비스 간에 이동 하려면 어댑터, Visual Studio 셸 명령 편집기 서비스를 사용할 수 있습니다. 이것이 어떻게 Visual Studio 편집기 현재 호스트입니다. 어댑터도에서 정확 하 게 작동 하려면 레거시 편집기와 언어 서비스 확장 사용 Visual Studio 2010.
편집기 어댑터를 사용 하 여
IVsEditorAdaptersFactoryService 새 편집기 인터페이스와 레거시 인터페이스 사이 전환 하는 방법 및 어댑터를 만드는 방법을 제공 합니다.
MEF 컴포넌트 부품에이 서비스를 사용 하는 경우 다음과 같은 서비스를 가져올 수 있습니다.
[Import(typeof(IVsEditorAdaptersFactoryService))]
internal IVsEditorAdaptersFactoryService editorFactory;
이 항목의 뒷부분에 나오는 "사용 하 여 Visual Studio 편집기 서비스에는 비 MEF 구성" 섹션에서 지시 MEF 아닌 구성 요소에서이 서비스를 사용 하려는 경우.
새 편집기 API와 레거시 API 간의 전환
편집기 개체 및 레거시 인터페이스 전환 하려면 다음 메서드를 사용 합니다.
메서드 |
변환 |
---|---|
ITextBuffer을 IVsTextBuffer로 변환합니다. |
|
IVsTextBuffer을 ITextBuffer로 변환합니다. |
|
IVsTextBuffer을 ITextBuffer로 변환합니다. |
|
ITextView을 IVsTextView로 변환합니다. |
|
IVsTextView을 IWpfTextView로 변환합니다. |
어댑터 만들기
레거시 인터페이스에 대 한 어댑터를 만들려면 다음 메서드를 사용 합니다.
메서드 |
변환 |
---|---|
IVsCodeWindow를 만듭니다. |
|
생성 된 IVsTextBuffer 지정한 IContentType. |
|
IVsTextBuffer를 만듭니다. |
|
IVsTextBufferCoordinator를 만듭니다. |
|
ITextViewRoleSet에 대해 IVsTextView를 만듭니다. |
|
IVsTextView를 만듭니다. |
관리 되지 않는 코드에서 어댑터 만들기
모든 어댑터 클래스 로컬에 등록 된 co-creatable, 및를 사용 하 여 인스턴스화할 수 있는 VsLocalCreateInstance() 함수.
Vsshlids.h 파일에 정의 된 Guid를 사용 하 여 만든 모든 어댑터는. \VisualStudioIntegration\Common\Inc\ 폴더의 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 IVx * 인터페이스로 COM 호출 가능 인터페이스를 노출 합니다. 예를 들어, Microsoft.VisualStudio.Platform.VSEditor.Interop.IVxTextBuffer 인터페이스의 COM 버전입니다 있는 ITextBuffer 인터페이스입니다. IVxTextBuffer, 버퍼 스냅숏에 액세스할 버퍼를 수정, 텍스트 변경 이벤트는 버퍼에서 수신 하 고 추적 지점 및 범위를 만들 수 있습니다. 다음 단계에 액세스 하는 방법을 보여는 IVxTextBuffer 에서 IVsTextBuffer.
Ivxtextbuffer를 가져올 수
IVx * 인터페이스에 대 한 정의 VSEditor.h 파일에 해당 합니다. \VisualStudioIntegration\Common\Inc\ 폴더의 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 서비스를 얻을.
MEF 아닌 구성 요소에서 Visual Studio 편집기 구성 요소를 사용 하려면
Microsoft.VisualStudio.ComponentModelHost.dll 어셈블리에 대 한 참조 추가. Visual Studio 설치의 \Common7\IDE\ 폴더에 있습니다. 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>();