为什么在 UI 自动化客户端中捕获的异常出现在正在自动化的 UI 中



一点背景...

我正在开发一个 UI 自动化应用程序,该应用程序与 UI 上的控件随机交互。自动化的应用和 UI 都是 WPF 应用程序。我正在使用UI 自动化辅助功能框架。偶尔我会在我的应用程序中收到一个 ElementNotAvailableException,我捕获并处理它。在使用 ANTS 7 分析我们的 UI 时,我注意到这些异常出现在第 2 代垃圾堆上。异常的新实例与我在应用中捕获异常的次数匹配。

我已经使用WinDBG,UIAutomation页面查看了GCRoot,但我没有找到明确的解释,说明为什么在自动化的应用程序中会出现捕获的异常。这些对象在 UI 自动化时不会释放,甚至在我关闭自动化应用程序时仍然存在。

有什么想法吗?

在不确切知道它是如何实现的情况下,我们可以知道,为了让 UI 自动化完成它需要做的事情:

  • 仪器,以及
  • 进程间通信

检测部分由基础结构组成,这些基础结构按字面意思编译到 UI 框架中的所有类中或添加到框架中,如果您愿意,可以挂钩。 它"感染"主机应用程序并在其中运行一个迷你应用程序。

进程间通信部分用于在客户端和主机之间传递非图形信息,例如文本框的实际内容。 这听起来很简单,但从字面上调用在两个进程之间注入和交换类型和值。

现在,当您将这两件事结合起来时,可以将异常作为进程间通信的一部分进行交换,并且该异常可以作为自动化框架的迷你应用程序作为参考,并且您对它如何发生有一个推测性的解释。

就您而言,如果您足够好奇或有足够的动力(可能是由于错误),您可以使用各种工具继续深入研究此问题。 你有调试器、ILSpy、黑盒实验、堆工具等。 这取决于你需要走多远。

最新更新