#c# #wpf #debugging #automation #microsoft-ui-automation
#c# #wpf #отладка #автоматизация #microsoft-ui-automation
Вопрос:
Немного предыстории…
Я разрабатываю приложение для автоматизации пользовательского интерфейса, которое случайным образом взаимодействует с элементами управления в нашем пользовательском интерфейсе. И приложение, и автоматизируемый пользовательский интерфейс являются приложениями WPF. Я использую платформу специальных возможностей автоматизации пользовательского интерфейса. Иногда я получаю исключение ElementNotAvailableException в моем приложении, которое я перехватываю и обрабатываю. При профилировании нашего пользовательского интерфейса с использованием ANTS 7 я заметил, что эти исключения отображаются в мусорной куче Gen 2. Новые экземпляры исключения соответствуют количеству раз, когда я перехватывал исключение в своем приложении.
Я просмотрел GCRoot, используя WinDbg, страницы UIAutomation, и я не нашел четкого объяснения того, почему пойманное исключение появляется в автоматизируемом приложении. Объекты не освобождаются при автоматизации пользовательского интерфейса и даже остаются, когда я закрываю свое приложение автоматизации.
Есть идеи?
Ответ №1:
Не зная точно, как это реализовано, мы можем знать, что для того, чтобы автоматизация пользовательского интерфейса выполняла то, что она делает, ей нужно делать:
- инструментирование и
- межпроцессное взаимодействие
Часть инструментария состоит из инфраструктуры, которая буквально скомпилирована во все классы в фреймворке пользовательского интерфейса или добавлена к фреймворку, подключена, если хотите. Это «заражает» хост-приложение и запускает мини-приложение внутри него.
Часть межпроцессного взаимодействия необходима для передачи неграфической информации между клиентом и хостом, такой как фактическое содержимое текстового поля. Это звучит просто, но вызывает буквально внедрение и обмен типами и значениями между двумя процессами.
Теперь, когда вы объединяете эти две вещи, исключение может быть передано как часть межпроцессного взаимодействия, и это исключение может храниться в качестве ссылки мини-приложением, которое является платформой автоматизации, и у вас есть предположительное объяснение того, как это могло произойти.
В вашем случае, если вы достаточно любопытны или достаточно мотивированы (возможно, из-за ошибки), вы могли бы продолжить изучение этой проблемы с помощью различных инструментов. У вас есть отладчик, ILSpy, эксперименты с черным ящиком, инструменты кучи и т.д. Вам решать, как далеко вам нужно зайти.
Комментарии:
1. Спасибо за ответ. Мое подозрение заключалось в том, что что-то со связью между приложением автоматизации и пользовательским интерфейсом привело к появлению исключения в пользовательском интерфейсе, которое автоматизируется с помощью not disposed. Я рассмотрю дальше еще несколько инструментов отладки.