2

一点背景...

我正在开发一个 UI 自动化应用程序,它与我们 UI 上的控件随机交互。被自动化的应用程序和 UI 都是 WPF 应用程序。我正在使用 UI 自动化可访问性框架。有时我会在我的应用程序中捕获并处理一个 ElementNotAvailableException。在使用 ANTS 7 分析我们的 UI 时,我注意到这些异常出现在 Gen 2 垃圾堆上。异常的新实例与我在应用程序中捕获异常的次数相匹配。

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

有任何想法吗?

4

1 回答 1

1

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

  • 仪器仪表,和
  • 进程间通信

检测部分由基础结构组成,这些基础结构实际上被编译到 UI 框架中的所有类中,或者添加到框架中,如果你愿意,可以钩住。它“感染”宿主应用程序并在其中运行一个迷你应用程序。

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

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

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

于 2011-05-16T22:11:26.063 回答