2017-11-27 49 views
0

Hello WorldプロジェクトConcord Samplesに基づいてビジュアルスタジオの拡張機能を作成しています。目的は、検索文字列のリストを設定してスタックフレームをフィルタリングすることです。いずれかの検索文字列がスタックフレーム内にある場合、その文字列は省略されます。Visual Studio Debugger Extensionユーザー設定を取得する

ハードコーディングされたリストのフィルタが動作しています。それはデバッガがそれを拾うために非パッケージベースのdllプロジェクトにある必要があります。そして私は文字列のリストを受け入れるOptionPageGridでdllを参照するvsixプロジェクトを持っています。しかし、私の人生は、それらを結ぶ方法を見つけることができません。私は理論的にユーザー設定から文字列を取得する必要がどこ

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; 
      } 
     } 

CallstackCollapserDataItemがある:デバッガ側では

は、私のコードは次のようになります。しかし、私はどんなサービス/パッケージにもアクセスすることができません。 You've Been Haacked's Exampleのように、WritableSettingsStoreを求めてください。 MSDN Options Exampleのように、OptionPageGridを取得することもできません。

私が試したもう1つのものは、this StackOverflow questionに基づいていました。私はOptionPageGridのLoadSettingsFromStorage関数をオーバーライドし、dllプロジェクトのパブリッククラスに静的変数を設定しようとしました。しかし、そのコードがLoadSettingsFromStorage関数にまったく存在していたとしても、関数を入力しなくても設定が読み込まれませんでした。私はブードゥーのように感じた。変数を設定する行をコメントアウトし、ブレークポイントが正常にヒットし、設定が正常にロードされます。これを復元すると、機能は入力されません。

私は迷っています。私はConcord拡張機能に文字列を渡したいだけです。本当に気にしません。

+0

私はOptionGridPageからの私の設定が14.0Expセッションの実行の間中存続しているが、私はどこでもレジストリでそれを見つけることができないことに注意してください。 「DialogPage \\ vsix.CallstackCollapserOptionPageGrid」 とDkmGlobalSettings.RegistryRootは次のとおりです:ダイアログ・ページには、次のSettingsRegistryPathあり 「ソフトウェア\\マイクロソフト\\ VisualStudioを\\ 14.0Exp」 をしかし、私はかもしれませんがしてみてください、私はできません私のレジストリに一致するものを見つける。 –

+0

ここにあります:Computer \ HKEY_CURRENT_USER \ Software \ Microsoft \ VisualStudio \ 14.0Exp \ ApplicationPrivateSettings \ vsix \ CallstackCollapserOptionPageGrid –

答えて

0

私がする必要があったのは、最後の小さな部分を見つけ出すためにここに質問を投稿することでした。私のCallstackCollapserDataItemで:

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がCallstackCollapserOptionPageGridがDialogPageである集合体であり、かつSearchStringsは、オプションメニューの外に保存されます、そのパブリックプロパティです:DkmDataItemクラス、私は次のコードを追加しました。

+0

この問題は解決されているので、これを回答としてマークすることができます。あなたのものとして発行してください。あなたの共有をありがとう:) –

+0

リマインダーありがとう。それはあなたが2日間自分の答えを受け入れることはできませんが、今はその時が過ぎました。 –

関連する問題