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

C# 为什么UI自动化客户端中捕获的异常会出现在正在自动化的UI中?,c#,wpf,debugging,automation,microsoft-ui-automation,C#,Wpf,Debugging,Automation,Microsoft Ui Automation,有点背景 我正在开发一个UI自动化应用程序,它可以与UI上的控件进行随机交互。正在自动化的应用程序和UI都是WPF应用程序。我正在使用UI自动化可访问性框架。偶尔我会在我的应用程序中发现ElementNotAvailableException,我会捕获并处理它。在使用Ants7评测UI时,我注意到这些异常出现在Gen2垃圾堆上。该异常的新实例与我在应用程序中捕获该异常的次数相匹配 我已经使用WinDBG、UIAutomation页面查看了GCRoot,但我没有找到一个明确的解释,解释为什么在正在

有点背景

我正在开发一个UI自动化应用程序,它可以与UI上的控件进行随机交互。正在自动化的应用程序和UI都是WPF应用程序。我正在使用UI自动化可访问性框架。偶尔我会在我的应用程序中发现ElementNotAvailableException,我会捕获并处理它。在使用Ants7评测UI时,我注意到这些异常出现在Gen2垃圾堆上。该异常的新实例与我在应用程序中捕获该异常的次数相匹配

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


有什么想法吗?

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

  • 仪器,以及
  • 进程间通信
插装部分由基础设施组成,这些基础设施被编译到UI框架中的所有类中,或者添加到框架中,如果您愿意,可以挂接。它“感染”主机应用程序并在其中运行一个小型应用程序

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

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


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

感谢您的回复。我的怀疑是自动化应用程序和UI之间的通信有问题,导致异常出现在未处理的自动化UI中。我将进一步介绍一些调试工具。