언어 서비스 (패키지 관리 프레임 워크)를 등록 하는 중
패키지 관리 framework (MPF)가 있는 VSPackage 언어 서비스 proffered입니다 (참조 하십시오 VSPackages)와 등록 된 Visual Studio 레지스트리 키 및 항목을 추가 하 여. 이 등록 프로세스 설치 하는 동안 부분적으로 한 부분적으로 런타임에 수행 됩니다.
특성을 사용 하 여 언어 서비스 등록
다음 특성 사용 하 여 언어 서비스를 등록 합니다.
이 특성 아래의
ProvideServiceAttribute
이 특성 언어 서비스를 서비스를 등록합니다.
예제
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideServiceAttribute(typeof(TestLanguageService),
ServiceName = "Test Language Service")]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageServiceAttribute
이 특성 언어 서비스로 특히 언어 서비스를 등록합니다. 언어 서비스를 제공 하는 기능을 지정 하는 옵션을 설정할 수 있습니다. 언어 서비스를 제공할 수 있는 옵션의 하위 집합을 보여 줍니다. 언어 서비스 옵션의 전체 집합을 참조 하십시오. ProvideLanguageServiceAttribute.
예제
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideLanguageServiceAttribute(typeof(TestLanguageService),
"Test Language",
106, // resource ID of localized language name
CodeSense = true, // Supports IntelliSense
RequestStockColors = false, // Supplies custom colors
EnableCommenting = true, // Supports commenting out code
EnableAsyncCompletion = true // Supports background parsing
)]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageExtensionAttribute
이 특성을 언어 서비스 파일 확장명과 연결합니다. 모든 프로젝트에서 해당 확장명을 가진 파일 로드 될 때마다 언어 서비스를 시작 하 고 파일의 내용을 표시 하는 데 사용 됩니다.
예제
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideLanguageExtensionAttribute(typeof(TestLanguageService),
".Testext")]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageCodeExpansionAttribute
이 특성 확장 또는 코드 조각 템플릿 코드에서 얻을 수 있는 위치를 등록 합니다. 이 정보를 사용 하 여 해당 코드 조각을 브라우저 및 소스 파일에 코드 조각을 삽입할 때 편집기에서.
예제
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideLanguageCodeExpansionAttribute(
typeof(TestLanguageService),
"Test Language", // Name of language used as registry key.
106, // Resource ID of localized name of language service.
"testlanguage", // language key used in snippet templates.
@"%InstallRoot%\Test Language\SnippetsIndex.xml", // Path to snippets index
SearchPaths = @"%InstallRoot%\Test Language\Snippets\%LCID%\Snippets\;" +
@"%TestDocs%\Code Snippets\Test Language\Test Code Snippets"
)]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageEditorOptionPageAttribute
이 특성을 속성 페이지에 표시할 등록은 옵션 대화 상자 아래에 텍스트 편집기 범주. 언어 서비스에 대해 표시 되는 각 페이지에 대 한이 속성을 사용 합니다. 페이지 트리 구조에서를 구성 하는 경우 추가 특성을 사용 하 여 트리의 각 노드를 정의 합니다.
예제
두 속성 페이지를 보여 주는이 예제 옵션 및 들여쓰기, 및 두 번째 속성 페이지를 포함 한 노드가 있습니다.
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideLanguageEditorOptionAttribute(
"Test Language", // Registry key name for language
"Options", // Registry key name for property page
"#242", // Localized name of property page
OptionPageGuid = "{A2FE74E1-FFFF-3311-4342-123052450768}" // GUID of property page
)]
[ProvideLanguageEditorOptionAttribute(
"Test Language", // Registry key name for language
"Advanced", // Registry key name for node
"#243", // Localized name of node
)]
[ProvideLanguageEditorOptionAttribute(
"Test Language", // Registry key name for language
@"Advanced\Indenting", // Registry key name for property page
"#244", // Localized name of property page
OptionPageGuid = "{A2FE74E2-FFFF-3311-4342-123052450768}" // GUID of property page
)]
public class TestLanguagePackage : Package
{
}
}
Proffer 런타임에 언어 서비스
언어 패키지를 로드할 때 알려야 합니다 Visual Studio 언어 서비스가 준비 되어 있습니다. 서비스 proffering 하 여이 작업을 수행 합니다. 이 수행은 Initialize 방법입니다. 또한 배경 구문 분석을 수행할 수 있습니다 있도록 유휴 기간 동안 언어 서비스를 호출 하는 타이머를 시작 해야 합니다. 이 유휴 시간 통해 구현한 경우 문서 속성을 업데이트도 사용 됩니다에서 DocumentProperties 클래스입니다. 패키지를 타이머를 지원 하기 위해 구현 해야는 IOleComponent 인터페이스 (만 FDoIdle 메서드는 완전히 구현 되도록 합니다. 나머지 메서드는 기본값을 반환할 수 있습니다).
예제
Proffering 서비스 및 유휴 타이머가 제공 하는 일반적인 접근 방법을 보여 주는이 예제입니다.
using System;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
[Microsoft.VisualStudio.Shell.ProvideService(typeof(TestLanguageService))]
[Microsoft.VisualStudio.Shell.ProvideLanguageExtension(typeof(TestLanguageService), ".testext")]
[Microsoft.VisualStudio.Shell.ProvideLanguageService(typeof(TestLanguageService), "Test Language", 0,
AutoOutlining = true,
EnableCommenting = true,
MatchBraces = true,
ShowMatchingBrace = true)]
[Guid("00000000-0000-0000-0000-00000000000")] //provide a unique GUID for the package
public class TestLanguagePackage : Package, IOleComponent
{
private uint m_componentID;
protected override void Initialize()
{
base.Initialize(); // required
// Proffer the service.
IServiceContainer serviceContainer = this as IServiceContainer;
TestLanguageService langService = new TestLanguageService();
langService.SetSite(this);
serviceContainer.AddService(typeof(TestLanguageService),
langService,
true);
// Register a timer to call our language service during
// idle periods.
IOleComponentManager mgr = GetService(typeof(SOleComponentManager))
as IOleComponentManager;
if (m_componentID == 0 && mgr != null)
{
OLECRINFO[] crinfo = new OLECRINFO[1];
crinfo[0].cbSize = (uint)Marshal.SizeOf(typeof(OLECRINFO));
crinfo[0].grfcrf = (uint)_OLECRF.olecrfNeedIdleTime |
(uint)_OLECRF.olecrfNeedPeriodicIdleTime;
crinfo[0].grfcadvf = (uint)_OLECADVF.olecadvfModal |
(uint)_OLECADVF.olecadvfRedrawOff |
(uint)_OLECADVF.olecadvfWarningsOff;
crinfo[0].uIdleTimeInterval = 1000;
int hr = mgr.FRegisterComponent(this, crinfo, out m_componentID);
}
}
protected override void Dispose(bool disposing)
{
if (m_componentID != 0)
{
IOleComponentManager mgr = GetService(typeof(SOleComponentManager))
as IOleComponentManager;
if (mgr != null)
{
int hr = mgr.FRevokeComponent(m_componentID);
}
m_componentID = 0;
}
base.Dispose(disposing);
}
#region IOleComponent Members
public int FDoIdle(uint grfidlef)
{
bool bPeriodic = (grfidlef & (uint)_OLEIDLEF.oleidlefPeriodic) != 0;
// Use typeof(TestLanguageService) because we need to
// reference the GUID for our language service.
LanguageService service = GetService(typeof(TestLanguageService))
as LanguageService;
if (service != null)
{
service.OnIdle(bPeriodic);
}
return 0;
}
public int FContinueMessageLoop(uint uReason,
IntPtr pvLoopData,
MSG[] pMsgPeeked)
{
return 1;
}
public int FPreTranslateMessage(MSG[] pMsg)
{
return 0;
}
public int FQueryTerminate(int fPromptUser)
{
return 1;
}
public int FReserved1(uint dwReserved,
uint message,
IntPtr wParam,
IntPtr lParam)
{
return 1;
}
public IntPtr HwndGetWindow(uint dwWhich, uint dwReserved)
{
return IntPtr.Zero;
}
public void OnActivationChange(IOleComponent pic,
int fSameComponent,
OLECRINFO[] pcrinfo,
int fHostIsActivating,
OLECHOSTINFO[] pchostinfo,
uint dwReserved)
{
}
public void OnAppActivate(int fActive, uint dwOtherThreadID)
{
}
public void OnEnterState(uint uStateID, int fEnter)
{
}
public void OnLoseActivation()
{
}
public void Terminate()
{
}
#endregion
}
}