Wenn Sie einen Sprachdienst registrieren (Managed Paketframework)
In verwaltetem Paketframework (MPF), wird der Sprachdienst von VSPackages (siehe VSPackages), vorgebracht und mit Visual Studio registriert, indem Registrierungsschlüssel und Einträge hinzufügt. Dieser Registrierungsvorgang ist in der DROP-Aktion während der Installation und teils zur Laufzeit durchgeführt.
Registrieren Sie den Sprachdienst mithilfe von Attributen
Die folgenden Attribute werden verwendet, um einen Sprachdienst registrieren.
Diese Attribute sind im Folgenden erklärt
ProvideServiceAttribute
Dieses Attribut als Sprachdienst registriert den Dienst.
Beispiel
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideServiceAttribute(typeof(TestLanguageService),
ServiceName = "Test Language Service")]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageServiceAttribute
Dieses Attribut registriert den Sprachdienst speziell als Sprachdienst. Sie können Optionen festlegen, die diese Funktionen der Sprache leistungsangebote angeben. Im Beispiel wird eine Teilmenge der Optionen an, die ein Sprachdienst bereitstellen kann. Für den vollständigen Satz von Optionen finden Sie unter ProvideLanguageServiceAttributeSprachdienst.
Beispiel
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
Dieses Attribut wird der Sprachdienst mit einer Dateierweiterung an. Sobald eine Datei mit der Erweiterung in jedem Projekt, der Sprachdienst geladen wird, wird gestartet, und der Inhalt der Datei anzuzeigen.
Beispiel
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideLanguageExtensionAttribute(typeof(TestLanguageService),
".Testext")]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageCodeExpansionAttribute
Dieses Attribut registriert einen Speicherort, von dem Code erweiterungs- oder Ausschnitts von abgerufen werden. Diese Informationen werden aus Codeausschnitt-Browser und vom Editor verwendet, wenn ein Codeausschnitt in die Quelldatei eingefügt wird.
Beispiel
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
Dieses Attribut registriert eine Optionen im Dialogfeld Eigenschaftenseite angezeigt werden, unter der Text-Editor Kategorie. Verwenden Sie eines dieser Attribute, dass jede Seite für den Sprachdienst angezeigt werden kann. Wenn Sie die Seiten in einer Baumstruktur organisieren, müssen Sie zusätzliche Attribute verwenden, um die einzelnen Knoten der Struktur zu definieren.
Beispiel
In diesem Beispiel werden zwei Eigenschaftenseiten, Optionen und Einzugund ein Knoten angezeigt, der die zweite Seite Eigenschaften enthält.
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
{
}
}
Bringen Sie den Sprachdienst zur Laufzeit vor
Wenn das Sprachen Paket geladen wird, müssen Sie Visual Studio mitteilen, dass der Sprachdienst bereit ist. Hierzu müssen Sie den Dienst vorbringen. Dies ist in der Initialize-Methode durchgeführt. Darüber hinaus müssen Sie einen Zeitgeber starten, der den Sprachdienst während der Punkte im Leerlauf aufgerufen wird, sodass der Analyse Hintergrund ausgeführt werden kann. Dieser Zeitgeber im Leerlauf wird auch verwendet, um Dokumenteigenschaften aktualisieren, wenn Sie von der DocumentProperties-Klasse implementiert haben. Um einen Zeitgeber zu unterstützen, muss das Paket die IOleComponent-Schnittstelle implementieren (nur die FDoIdle-Methode muss vollständig implementiert werden. Die übrigen Methoden können Standardwerte zurückgeben).
Beispiel
In diesem Beispiel wird ein typischer Ansatz zum Vorbringen eines Diensts und der Angabe eines Zeitgebers im Leerlauf an.
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
}
}