Фон
Я пишу расширение Visual Studio на С#, которое выполняет код в окне Immediate при отладке другого приложения. Выражение возвращает значение, которое может быть целым числом, строковым литералом, классом и т. д. Приложение, которое я отлаживаю, написано на C++.
Код
Для выполнения команд Immediate Window я использую эту строку кода:
var expression = dte.Debugger.GetExpression("funcname()");
И для получения результата я использую:
string val = expression.Value;
а также:
var children = expression.DataMembers;
Вот myFunc() в приложении, которое я отлаживаю:
std::vector<int> myFunc()
{
return { 1, 2, 3, 4, 5 };
}
Проблема
Когда я вручную запускаю выражение в окне Immediate Window, возвращаемый объект выгружается так, как я его вижу в окне Watch (см. здесь). Мне удалось найти имена всех дочерних элементов, но значения отсутствуют (см. здесь) .
Я хочу получить DisplayString ({ size=5 }
), но пока не нашел ничего полезного.
Как получить поле DisplayString из Debugger.GetExpression?
EDIT: мне не нужно использовать этот API. Если вы знаете другой способ вернуть это жало, пожалуйста, предложите его. Одной из идей может быть получение полной выходной строки окна Immediate (см. справа ), а затем анализировать его.
EDIT2: посмотрите это видео, которое лучше объясняет проблему
string val= expression.Value;
, как на снимке экрана, которым вы поделились, будет отображаться{size=5}
? - person LoLance   schedule 07.10.2020expression.Value
возвращает строку, поэтому то, что вы можете видеть на втором снимке экрана, - это то, что я получаю. Я пытался проверить переменнуюexpression
, ноValue
— единственное свойство, которое имеет смысл. Другими доступными свойствами являютсяType
,Name
иDataMembers
, но ни одно из них не содержит{ size=5 }
. Также есть свойствоCollection
, но оно всегда равно null, и я думаю, что это не решение моей проблемы. Что меня сводит с ума, так это то, что имена DataMembers следуют за визуализатором. Свойство value из них имеет ту же проблему. - person lax48   schedule 07.10.2020size
является функцией-членом std:Vector. И я думаю, что свойства выражения не могут получитьsize
напрямую. - person Mr Qian   schedule 08.10.2020{ size=5 }
— это отображаемая строка, определенная в файле визуализатора (.natvis). Если бы GetExpression не смог получить значениеsize
, весь пользовательский визуализатор вышел бы из строя, и поэтому был бы использован тот, который используется по умолчанию. С другой стороны, если вы посмотрите наexpression.DataMembers
, вы увидите, что элементы соответствуют пользовательскому визуализатору. - person lax48   schedule 08.10.2020size()
является функцией-членом классаstd::vector
, и, конечно же, свойства выражения не могут выполнять методsize()
. Если вы посмотрите на пример natvis для std::vector в моем комментарии перед этим, вы увидите, что размер вычисляется путем вычитания конечного указателя из начального указателя (_Mylast - _Myfirst
). Однако визуализатор корректно работает в Watch Window и Immediate Window, но не полностью работает сGetExpression()
(дочерние элементы расширителя совпадают с именами вDataMembers
, но значение параметра ... - person lax48   schedule 08.10.2020Value
действительно возвращает тип String, не уверен, что Sting можно изменить на int… ИDataMembers
возвращает коллекцию выражений, но она используется для получения коллекции выражений, вы можете проверьте этот пример и интерфейс выражений. Так чтоDataMembers
может не работать. - person Mr Qian   schedule 09.10.2020"{ size=5 }"
или как там написано в отображаемой строке в файле natvis. - person lax48   schedule 09.10.2020DataMembers
содержит то, что я ожидаю. Я думаю, что я опубликую видео в своем вопросе, чтобы сделать его более понятным - person lax48   schedule 09.10.2020