Почему в клиенте автоматизации пользовательского интерфейса появляются исключения, которые отображаются в пользовательском интерфейсе автоматически? - PullRequest
2 голосов
/ 17 мая 2011

Немного предыстории ...

Я занимаюсь разработкой приложения для автоматизации пользовательского интерфейса, которое случайным образом взаимодействует с элементами управления нашего пользовательского интерфейса.И приложение, и автоматизируемый пользовательский интерфейс являются приложениями WPF.Я использую инфраструктуру доступности UI Automation.Иногда в моем приложении появляется исключение ElementNotAvailableException, которое я ловлю и обрабатываю.При профилировании нашего пользовательского интерфейса с использованием ANTS 7 я заметил, что эти исключения отображаются в куче мусора Gen 2.Новые экземпляры исключения соответствуют числу раз, когда я обнаружил исключение в своем приложении.

Я посмотрел на GCRoot, используя WinDBG, страницы UIAutomation, и я не нашел четкого объяснения того, почему в автоматизируемом приложении появляется пойманное исключение.Объекты не освобождаются, когда пользовательский интерфейс автоматизируется, и даже остаются, когда я закрываю свое приложение автоматизации.

Есть идеи?

1 Ответ

1 голос
/ 17 мая 2011

Не зная точно, как это реализовано, мы можем знать, что для того, чтобы автоматизация пользовательского интерфейса выполняла то, что она делает, она должна:

  • контрольно-измерительные приборы и
  • межпроцессное взаимодействие

Инструментальная часть состоит из инфраструктуры, которая буквально скомпилирована во все классы в структуре пользовательского интерфейса или добавлена ​​в среду, подключенную, если хотите. Он «заражает» хост-приложение и запускает внутри него мини-приложение.

Часть межпроцессного взаимодействия необходима для передачи неграфической информации между клиентом и хостом, такой как фактическое содержимое текстового поля. Это звучит просто, но вызывает буквальное внедрение и обмен типов и значений между двумя процессами.

Теперь, когда вы объединяете эти две вещи, исключение можно обменивать как часть межпроцессного взаимодействия, и это исключение может храниться в качестве ссылки в мини-приложении, которое является структурой автоматизации, и у вас есть умозрительное объяснение того, как оно может произойти.

В вашем случае, если вы достаточно любопытны или мотивированы (возможно, из-за ошибки), вы можете продолжить изучение этой проблемы с помощью различных инструментов. У вас есть отладчик, ILSpy, эксперименты с «черным ящиком», инструменты кучи и т. Д. Вам решать, как далеко вы должны зайти.

...