2017-11-27 44 views
0

Ich schreibe eine Visual Studio-Erweiterung auf der Grundlage der Concord Samples Hallo Welt Projekt. Das Ziel besteht darin, den Benutzer Stack-Frames herausfiltern zu lassen, indem er eine Liste von Such-Strings einstellt. Wenn sich eine der Suchzeichenfolgen in einem Stapelrahmen befindet, wird sie weggelassen.Visual Studio Debugger Extension erhalten Benutzereinstellungen

Ich habe den Filter arbeiten für eine hartcodierte Liste. Das muss in einem nicht paketbasierten Dll-Projekt sein, damit der Debugger es aufnehmen kann. Und ich habe ein Vsix-Projekt, das diese DLL mit einem OptionPageGrid referenziert, um die Liste der Zeichenfolgen zu akzeptieren. Aber ich kann nicht für das Leben von mir einen Weg finden, sie zu verbinden.

In der Debugger-Seite sieht mein Code so etwas wie dieses:

DkmStackWalkFrame[] IDkmCallStackFilter.FilterNextFrame(DkmStackContext stackContext, DkmStackWalkFrame input) 
    { 
     if (input == null) // null input frame indicates the end of the call stack. This sample does nothing on end-of-stack. 
      return null; 
     if (input.InstructionAddress == null) // error case 
      return new[] { input }; 

     DkmWorkList workList = DkmWorkList.Create(null); 
     DkmLanguage language = input.Process.EngineSettings.GetLanguage(new DkmCompilerId()); 
     DkmInspectionContext inspection = DkmInspectionContext.Create(stackContext.InspectionSession, input.RuntimeInstance, input.Thread, 1000, 
      DkmEvaluationFlags.None, DkmFuncEvalFlags.None, 10, language, null); 

     string frameName = ""; 
     inspection.GetFrameName(workList, input, DkmVariableInfoFlags.None, result => GotFrameName(result, out frameName)); 

     workList.Execute(); 

     CallstackCollapserDataItem dataItem = CallstackCollapserDataItem.GetInstance(stackContext); 

     bool omitFrame = false; 
     foreach (string filterString in dataItem.FilterStrings) 
     { 
      if (frameName.Contains(filterString)) 
      { 
       omitFrame = true; 
      } 
     } 

Die CallstackCollapserDataItem ist, wo ich theoretisch die Strings von Benutzereinstellungen abrufen müssen. Aber ich habe keinen Zugang zu irgendwelchen Diensten/Paketen, um z. Fragen Sie nach WritableSettingsStore, wie in You've Been Haacked's Example. Noch kann ich mein OptionPageGrid bekommen, wie in der MSDN Options Example. Die andere Sache, die ich versuchte, basierte auf this StackOverflow question. Ich habe die LoadSettingsFromStorage-Funktion meines OptionPageGrid überschrieben und versucht, eine statische Variable für eine öffentliche Klasse im DLL-Projekt festzulegen. Wenn dieser Code jedoch überhaupt in der LoadSettingsFromStorage-Funktion vorhanden war, konnten die Einstellungen nicht geladen werden, ohne die Funktion selbst aufzurufen. Was mir wie Voodoo vorkam. Kommentieren Sie die Zeile, die die Variable setzt, der Haltepunkt trifft normal, die Einstellungen werden normal geladen. Wiederherstellen, und die Funktion wird nicht einmal eingegeben.

Ich bin ratlos. Ich möchte wirklich nur eine Saite in meine Concord-Erweiterung einfügen, und es ist mir wirklich egal, wie.

+0

Beachten Sie, dass, während meine Einstellung von der OptionGridPage über Läufe der 14.0Exp-Sitzung beibehalten wird, ich es nirgends in der Registrierung finden kann. Die Dialogseite hat folgende SettingsRegistryPath: „Dialogpage \\ vsix.CallstackCollapserOptionPageGrid“ und die DkmGlobalSettings.RegistryRoot ist: „Software \\ Microsoft \\ Visual Studio \\ 14.0Exp“ Aber versuchen Sie, wie ich könnte, ich kann nicht finde in meiner Registrierung etwas passendes. –

+0

Da ist es: Computer \ HKEY_CURRENT_USER \ Software \ Microsoft \ VisualStudio \ 14.0Exp \ ApplicationPrivateSettings \ vsix \ CallstackCollapserOptionPageGrid –

Antwort

0

Ok, anscheinend war alles, was ich tun musste, die Frage hier für mich zu stellen, um die letzten kleinen Stücke herauszufinden. In meinem CallstackCollapserDataItem: DkmDataItem Klasse, habe ich den folgenden Code:

private CallstackCollapserDataItem() 
    { 
     string registryRoot = DkmGlobalSettings.RegistryRoot; 
     string propertyPath = "vsix\\CallstackCollapserOptionPageGrid"; 
     string fullKey = "HKEY_CURRENT_USER\\" + registryRoot + "\\ApplicationPrivateSettings\\" + propertyPath; 
     string savedStringSetting = (string)Registry.GetValue(fullKey, "SearchStrings", ""); 

     string semicolonSeparatedStrings = ""; 
     // The setting resembles "1*System String*Foo;Bar" 
     if (savedStringSetting != null && savedStringSetting.Length > 0 && savedStringSetting.Split('*').Length == 3) 
     { 
      semicolonSeparatedStrings = savedStringSetting.Split('*')[2]; 
     } 
    } 

VSIX ist die Montage in dem CallstackCollapserOptionPageGrid ein Dialogpage ist, und SearchStrings ist seine öffentliche Eigenschaft, die aus dem Optionsmenü gespeichert wird.

+0

Da dieses Problem jetzt behoben ist, können Sie es als die Antwort markieren, damit es anderen Community-Mitgliedern helfen kann, die dasselbe erhalten Ausgabe als Ihre. Vielen Dank für Ihr Teilen :) –

+0

Danke für die Erinnerung. Es lässt dich deine eigene Antwort nicht für 2 Tage akzeptieren, aber jetzt ist diese Zeit vergangen. –

Verwandte Themen