Exemplarische Vorgehensweise: Eine Liste der installierten Codeausschnitten (Managed Paketframework) abrufen
Ein Codeausschnitt handelt es sich um einen Codeabschnitt, der in den Quellpuffer mit einem Menübefehl eingefügt werden kann (das Auswählen unter einer Liste der installierten Codeausschnitten zulässig) oder durch Auswählen einer Ausschnitts Verknüpfung aus einer IntelliSense-Vervollständigungsliste.
Die EnumerateExpansions-Methode ruft alle Codeausschnitte für eine bestimmte Sprache GUID ab. Die Tastenkombinationen für diese Ausschnitte können in eine IntelliSense-Vervollständigungsliste eingefügt werden.
Unterstützung für verwalteten Code Snippets (Paketframework) finden Sie ausführliche Informationen zum Implementieren von Codeausschnitten in einem Sprachdienst des verwalteten Paketframeworks (MPF).
So zeigen Sie eine Liste von Codeausschnitten abrufen
Im folgenden Code wird gezeigt, wie eine Liste von Codeausschnitten für eine bestimmte Sprache abruft. Die Ergebnisse werden in einem Array VsExpansion Strukturen gespeichert. Diese Methode verwendet die statische GetGlobalService-Methode, um die IVsTextManager-Schnittstelle aus dem SVsTextManager Dienst abzurufen. Sie können jedoch auch den Dienstanbieter, der zu einem VSPackage angegeben ist und die QueryService-Methode aufrufen.
using System; using System.Collections; using System.Runtime.InteropServices; using Microsoft.VisualStudio.Package; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.TextManager.Interop; [Guid("00000000-0000-0000-0000-000000000000")] //create a new GUID for the language service namespace TestLanguage { class TestLanguageService : LanguageService { private void GetSnippets(Guid languageGuid, ref ArrayList expansionsList) { IVsTextManager textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager)); if (textManager != null) { IVsTextManager2 textManager2 = (IVsTextManager2)textManager; if (textManager2 != null) { IVsExpansionManager expansionManager = null; textManager2.GetExpansionManager(out expansionManager); if (expansionManager != null) { // Tell the environment to fetch all of our snippets. IVsExpansionEnumeration expansionEnumerator = null; expansionManager.EnumerateExpansions(languageGuid, 0, // return all info null, // return all types 0, // return all types 1, // include snippets without types 0, // do not include duplicates out expansionEnumerator); if (expansionEnumerator != null) { // Cache our expansions in a VsExpansion array uint count = 0; uint fetched = 0; VsExpansion expansionInfo = new VsExpansion(); IntPtr[] pExpansionInfo = new IntPtr[1]; // Allocate enough memory for one VSExpansion structure. This memory is filled in by the Next method. pExpansionInfo[0] = Marshal.AllocCoTaskMem(Marshal.SizeOf(expansionInfo)); expansionEnumerator.GetCount(out count); for (uint i = 0; i < count; i++) { expansionEnumerator.Next(1, pExpansionInfo, out fetched); if (fetched > 0) { // Convert the returned blob of data into a structure that can be read in managed code. expansionInfo = (VsExpansion)Marshal.PtrToStructure(pExpansionInfo[0], typeof(VsExpansion)); if (!String.IsNullOrEmpty(expansionInfo.shortcut)) { expansionsList.Add(expansionInfo); } } } Marshal.FreeCoTaskMem(pExpansionInfo[0]); } } } } } } }
So rufen GetSnippets-Methode
- Die folgende Methode wird gezeigt, wie die GetSnippets-Methode am Analyse Abschluss eines Vorgangs aufgerufen wird. Die OnParseComplete-Methode wird nach einem Analysevorgang aufgerufen, der mit dem Hinweis Checkgestartet wurde.
Hinweis
Die expansionsList Array listis aus Leistungsgründen gespeichert.Änderungen an den Ausschnitten werden in der Liste nicht wiedergegeben, bis der Sprachdienst beendet und dann neu geladen wird (z. B. durch das Beenden und Starten von Visual Studio).
class TestLanguageService : LanguageService
{
private ArrayList expansionsList;
public override void OnParseComplete(ParseRequest req)
{
if (this.expansionsList == null)
{
this.expansionsList = new ArrayList();
GetSnippets(this.GetLanguageServiceGuid(),
ref this.expansionsList);
}
}
}
Um die Ausschnitts verwendet werden
Der folgende Code zeigt, wie die Ausschnitts verwendet werden, die durch die GetSnippets-Methode zurückgegeben werden. Die AddSnippets-Methode wird vom Parser als Reaktion auf einen beliebigen Analysis grund aufgerufen, der verwendet wird, um eine Liste von Codeausschnitten aufzufüllen. Dies muss erfolgen, nachdem die vollständige Analyse zum ersten Mal ausgeführt wurde.
Die AddDeclaration-Methode erstellt eine Liste mit Deklarationen, die später in eine Vervollständigungsliste angezeigt wird.
Die TestDeclaration-Klasse enthält alle Informationen, die in der Vervollständigungsliste als auch im Deklarationstyp angezeigt werden können.
class TestAuthoringScope : AuthoringScope { public void AddDeclarations(TestDeclaration declaration) { if (m_declarations == null) m_declarations = new List<TestDeclaration>(); m_declarations.Add(declaration); } } class TestDeclaration { private string m_name; private string m_description; private string m_type; public TestDeclaration(string name, string desc, string type) { m_name = name; m_description = desc; m_type = type; } class TestLanguageService : LanguageService { internal void AddSnippets(ref TestAuthoringScope scope) { if (this.expansionsList != null && this.expansionsList.Count > 0) { int count = this.expansionsList.Count; for (int i = 0; i < count; i++) { VsExpansion expansionInfo = (VsExpansion)this.expansionsList[i]; scope.AddDeclaration(new TestDeclaration(expansionInfo.title, expansionInfo.description, "snippet")); } } } }
Siehe auch
Konzepte
Unterstützung für verwalteten Code Snippets (Paketframework)