Visual Studio Debugger Extension получить пользовательские настройки
Я пишу визуальное студийное расширение на основе проекта Hello World в примерах Concord Samples. Цель состоит в том, чтобы позволить пользователю отфильтровывать кадры стека, устанавливая список строк поиска. Если какая-либо из строк поиска находится в кадре стека, она опускается.
У меня есть фильтр, работающий для жестко закодированного списка. Это должно быть в dll-проекте, не основанном на пакетах, чтобы отладчик мог его забрать. И у меня есть проект vsix, который ссылается на эту DLL с OptionPageGrid, чтобы принять список строк. Но я не могу ради жизни найти способ соединить их.
На стороне отладчика мой код выглядит примерно так:
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 - это место, где мне теоретически нужно извлечь строки из пользовательских настроек. Но у меня нет доступа к каким-либо службам / пакетам, чтобы, например, запросить WritableSettingsStore, как в примере с Youacken Haacked. Также я не могу получить свой OptionPageGrid, как в примере с параметрами MSDN.
Другая вещь, которую я попробовал, была основана на этом вопросе Stackru. Я переопределил функцию LoadSettingsFromStorage моего OptionPageGrid и попытался установить статическую переменную для открытого класса в проекте dll. Но если этот код вообще существовал в функции LoadSettingsFromStorage, настройки не могли быть загружены даже без входа в функцию. Который был для меня как вуду. Закомментируйте строку, которая устанавливает переменную, точка останова попадает нормально, настройки загружаются нормально. Восстановите его, и функция даже не будет введена.
Я в недоумении. Я просто хочу передать строку в расширение Concord, и мне все равно, как.
1 ответ
Хорошо, очевидно, все, что мне нужно было сделать, это опубликовать здесь вопрос, чтобы я мог выяснить последние маленькие кусочки. В моем классе CallstackCollapserDataItem: DkmDataItem я добавил следующий код:
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 - его открытое свойство, которое сохраняется из меню параметров.