Оценка выражений с использованием Visual Studio 2005 SDK вместо отладчика автоматизации :: GetExpression - PullRequest
0 голосов
/ 03 февраля 2010

Я пытаюсь написать надстройку (или пакет, если необходимо) для Visual Studio 2005, которая нуждается в функциональности типа окна наблюдения - оценка выражений и проверка типов. Средства автоматизации обеспечивают Debugger::GetExpression, что достаточно полезно, но информация при условии, что это немного грубо.

При просмотре документов это звучит как IDebugExpressionContext2 было бы более полезным. С одним из них это выглядит так, как будто я могу получить больше информации из выражения - подробно информация о типе и любых членах и т. д., и т. д., без указания всего, как строки.

Я не могу найти способ получить IDebugExpressionContext2, хоть! IDebugProgramProvider2 вроде выглядит актуально, в этом я может начинаться с IDebugProgramProvider2::GetProviderProcessData и затем медленно просверлите, пока не достигнете того, что может контекст выражения - но мне нужно предоставить порт для этого, и это не понятно, как получить порт, соответствующий текущей отладке сессия. (Даже если бы я попробовал каждый порт, не очевидно, как сказать какой порт правильный ...)

Я начинаю подозревать, что это просто не поддерживаемый вариант использования, но, если повезет, я просто упустил что-то неожиданно очевидное.

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 31 мая 2010

Есть способ, которым вы можете воспользоваться, чтобы получить больше информации о типе переменной, которую вы оценили, используя метод Debugger :: GetExpression.

Вы можете оценить "AppDomain.CurrentDomain.GetAssemblies ()", чтобы загрузить все сборки, загруженные в отладчик, и кэшировать их в своей надстройке. Вам также может потребоваться прослушать новые сборки, загружаемые в домен приложений.

Затем выполните следующее:

Expression myExpression = Debugger.GetExpression(...);
Expression typeRefExpression = Debugger.GetExpression("typeof(" + myExpression.Type + ").FullName"

Когда у вас есть TypeFullName, вы можете искать в кэше сборок соответствующий System.Type, и, получив его, вы можете копать в нем все, что захотите, с помощью стандартного API Reflection.

Обратите внимание, что это будет работать только в C # из-за его ключевого слова "typeof". Например, вам придется использовать другое ключевое слово для VB.Net.

0 голосов
/ 03 февраля 2010

Используя IDebugExpressionContext, вы в конечном итоге получите экземпляр IDebugProperty.Этот интерфейс реализован службой Expression Evaluator.Обычно это услуга для конкретного языка.Он предназначен для абстрагирования от языка специфических деталей оценки выражения.Он понимает команды более высокого уровня, такие как «Оценивать» и проверки.

Я не думаю, что вы получите то, что ищете, хотя, потому что вы не можете получить любой тип объекта таким образом.Почти все методы проверки возвращают свои результаты в форме String.Например, вы не получите тип Int32, а вместо этого строку "int".Это делает проверку типов практически невозможной.

Я не верю, что вы пытаетесь это поддерживаемый случай.Оцениваемая система типов не существует в текущем процессе.Он существует в процессе отладки и получить доступ к нему довольно сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...