我们有一个混合.NET winforms和WPF的应用程序。这是一个经典的选项卡式应用程序,随着用户在选项卡中移动,工作流程也在不断发展。其中一个选项卡是托管WFP控件,基本上是一个包含控件的网格。计算机启用了触控功能,但也配有鼠标和键盘。这是一个医疗应用程序,在医院的10个特殊区域运行。
其中一个房间每天大约有一次出现此错误:
来自修补程序页面的堆栈跟踪: PresentationCore.dll!System.Windows.PresentationSource.CriticalFromVisual(System.Windows.DependencyObject v,bool enable2DTo3DTransition) PresentationFramework.dll!System.Windows.Controls.PopupControlService.OnPostProcessInput(object sender,System.Windows.Input.ProcessInputEventArgs e)
我们无法重现此错误,只会随机发生在用户身上。此外,用户只能记住错误发生时他们正在做的事情的细节。目前尚不清楚用户是否大多使用鼠标或触摸,我猜他们对鼠标更加舒适。触摸显示器具有多点触控功能,但由于其他问题,我们将其配置为仅用于单点触控。
我找到了2012年4月发布的以下修补程序,该修补程序的堆栈跟踪看起来完全相同:
我也可以从这些机器上获取.NET dll,它们来自2013年4月,似乎是后来的.NET框架汇总/服务包的一部分。
我还能够在PresentationCore.CriticalFromVisual()方法中设置断点并检查堆栈跟踪。我希望的是在堆栈中的某个地方我可以看到我的代码,然后为此错误添加try / catch并可能继续。然而,堆栈跟踪完全通过MS代码并以我的Main()结束,到那时为止重试为时已晚。
我反编译4.0文件并处理调用堆栈,检索参数“v”的地方(PresentationFramework.dll - PopupControlService.OnPostProcessInput)有一个空检查,如果返回null则返回null。这个逻辑不在我能找到的任何3.0代码中。我的开发机器从2015年7月开始有3.0 DLL,这些也不包含空检查。
所以我有几个选择: