逐步解說: 才會列出已安裝的程式碼片段 (受管理的封裝架構)
程式碼片段是一段程式碼,可以被插入到來源緩衝區 (以便讓選擇安裝的程式碼片段的清單) 的功能表命令或藉由從 IntelliSense 完成清單中選取的程式碼片段的捷徑。
EnumerateExpansions方法會取得所有的程式碼片段,針對特定語言的 GUID。 這些程式碼片段的捷徑可以被插入到 IntelliSense 的完成清單中。
請參閱程式碼片段 (受管理的封裝架構) 的支援如需受管理的封裝架構 (MPF) 語言服務中實作程式碼片段詳細資訊。
若要擷取的程式碼片段的清單
下列程式碼會示範如何取得特定語言的程式碼片段的清單。 結果會儲存在陣列的VsExpansion結構。 這個方法會使用靜態GetGlobalService方法來取得IVsTextManager介面從SVsTextManager服務。 不過,您也可以使用提供給您的 VSPackage 和呼叫的服務提供者QueryService方法。
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]); } } } } } } }
若要呼叫 GetSnippets 方法
- 下列方法示範如何呼叫GetSnippets在剖析作業完成時的方法。 OnParseComplete已啟動的原因在剖析作業之後,會呼叫方法Check。
注意事項 |
---|
expansionsList Listis 基於效能考量快取的陣列。程式碼片段的變更才會反映在清單中語言服務停止並重新載入 (例如,藉由停止並重新啟動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);
}
}
}
若要使用的程式碼片段資訊
下列程式碼示範如何使用所傳回的程式碼片段資訊GetSnippets方法。 AddSnippets方法從任何可使用來產生的程式碼片段的剖析原因的回應中的剖析器呼叫。 第一次已作過完整的分析之後,這就會發生。
AddDeclaration方法會建立一份宣告稍後顯示完成清單中。
TestDeclaration類別包含可顯示完成清單,以及宣告的型別中的所有資訊。
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")); } } } }