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 - его открытое свойство, которое сохраняется из меню параметров.

Другие вопросы по тегам