Registrando un servizio di linguaggio (managed package Framework)
Nel framework gestito del pacchetto (MPF), il servizio di linguaggio viene offerto da un VSPackage (vedere Vspackage) e registrato con Visual Studio aggiungendo le chiavi del Registro di sistema e le voci. Questo processo di registrazione viene eseguito parzialmente in durante l'installazione e parzialmente in fase di esecuzione.
Registrare il servizio di linguaggio utilizzando gli attributi
I seguenti attributi vengono utilizzati per registrare un servizio di linguaggio.
Questi attributi vengono spiegati in
ProvideServiceAttribute
Questo attributo viene registrato il servizio di linguaggio come servizio.
Esempio
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideServiceAttribute(typeof(TestLanguageService),
ServiceName = "Test Language Service")]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageServiceAttribute
Questo attributo viene registrato il servizio di linguaggio specificamente come servizio di linguaggio. Consente di impostare le opzioni che specificano le funzionalità che il servizio di linguaggio offre. L'esempio seguente mostra un sottoinsieme delle opzioni che un servizio di linguaggio che può fornire. Per l'insieme completo di opzioni del servizio di linguaggio, vedere ProvideLanguageServiceAttribute.
Esempio
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
questo attributo associa il servizio di linguaggio con un'estensione di file. Ogni volta che un file con tale estensione viene caricato, in tutto il progetto, il servizio di linguaggio viene avviato e utilizzato per visualizzare il contenuto del file.
Esempio
using Microsoft.VisualStudio.Shell;
namespace TestLanguagePackage
{
[ProvideLanguageExtensionAttribute(typeof(TestLanguageService),
".Testext")]
public class TestLanguagePackage : Package
{
}
}
ProvideLanguageCodeExpansionAttribute
Questo attributo registra una posizione in cui i modelli di espansione o frammenti di codice vengono ottenuti. Queste informazioni vengono utilizzate da Browser frammenti di codice e dall'editor quando un frammento di codice viene inserito nel file di origine.
Esempio
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
Questo attributo registra una pagina delle proprietà da visualizzare nella finestra di dialogo di opzioni nella categoria di editor di testo . Utilizzare uno di questi attributi per ogni pagina da visualizzare per il servizio di linguaggio. Se è necessario organizzare le pagine in una struttura ad albero, utilizzare attributi aggiuntivi per definire ogni nodo della struttura ad albero.
Esempio
In questo esempio vengono illustrati due pagine delle proprietà, opzioni e impostare un rientroe un nodo che contiene la seconda pagina delle proprietà.
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
{
}
}
Offrire il servizio di linguaggio in fase di esecuzione
Quando il pacchetto di linguaggio viene caricato, è necessario indicare a Visual Studio che il servizio di linguaggio è pronto. A tale scopo questi del servizio. Questa operazione viene eseguita nel metodo di Initialize . Inoltre, è necessario avviare un timer che chiama il servizio di linguaggio durante i periodi di inattività pertanto traccia in background può eseguire. Il timer inattivo viene utilizzato per aggiornare le proprietà del documento se è stato implementato uno tramite la classe di DocumentProperties . Per supportare un timer, il pacchetto deve implementare l'interfaccia di IOleComponent (solo il metodo di FDoIdle necessario completare essere implementato, i metodi rimanenti possono restituire i valori predefiniti).
Esempio
In questo esempio viene illustrato un approccio più comune a tutte del servizio e fornire un timer inattivo.
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
}
}