註冊舊版語言服務
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
VSPackage 在受管理的封裝架構 (MPF) 中,提供語言服務 (請參閱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
{
[ProvideLanguageEditorOptionPageAttribute(
"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
)]
[ProvideLanguageEditorOptionPageAttribute(
"Test Language", // Registry key name for language
"Advanced", // Registry key name for node
"#243", // Localized name of node
)]
[ProvideLanguageEditorOptionPageAttribute(
"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 服務。 這是初始化方法。 此外,您需要啟動閒置期間呼叫語言服務,因此可以完成背景剖析的計時器。 此閒置計時器也用來更新文件屬性,如果您已實作任何透過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
}
}