如何调试 WPF InitializeComponent() 中抛出的 EEFileLoadException?

Posted

技术标签:

【中文标题】如何调试 WPF InitializeComponent() 中抛出的 EEFileLoadException?【英文标题】:How to debug EEFileLoadException thrown inside WPF InitializeComponent()? 【发布时间】:2021-09-28 03:56:31 【问题描述】:

我的 C# 应用程序在 Visual Studio 输出窗口中看到很多 EEFileLoadExceptions。我不知道如何获取此异常的任何具体细节。其中有很多,而且当它们发生时似乎会消耗大量运行时间。

我特别想知道的是什么文件加载失败。

如果我打开 Visual Studio 设置“C++ 异常,”,那么调试器实际上会在异常上中断,但没有有用的细节。它显示了这一点:

我找不到其他详细信息...无论是这个弹出窗口还是我在 IDE 中知道的任何其他内容都不会显示更多详细信息(与 .NET 异常不同)。


尝试获取有关异常的信息:

在即时窗口中使用 $exception 不起作用(即使 IDE 已标记异常,它也无法识别)。

我无法在 C# 代码中尝试/捕获此异常。它只是不激活 catch 块,被我假设的 CLR 在内部捕获。我试过这样:

     try  InitializeComponent(); 
     catch  

我使用 Process Monitor 观察了该过程。但是,我 惊讶地发现没有任何文件加载失败的迹象。 (?)

我还在进程上运行了API Monitor;这表明 "Microsoft.VisualStudio.Debugger.Runtime.Desktop.dll" 正在 已加载,尽管我无法轻易判断它是找不到还是未加载 成功地。但由于此文件存在在它所在的位置 从加载,这可能是无关的。我没有看到其他有用的东西。


我的应用是这样构造的:

通过 COM 调用 C# 代码的原生 EXE(用 VB6 编写)。 .NET 代码,其中包含一些 WPF 屏幕

调试时 我让 Visual Studio IDE 实际上运行 VB6 IDE 而不是编译的 EXE。然后,VB6 代码在各个点回调到 C# 代码。当这种情况发生时,就会出现这些异常。

在各种 WPF InitializeComponent() 调用期间发生异常。它不会直接出现在我自己的代码中。


输出窗口中的异常如下所示:

Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: EEFileLoadException at memory location 0x0019663C.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: EEFileLoadException at memory location 0x00195E64.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: EEFileLoadException at memory location 0x0019699C.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
Exception thrown at 0x74D42802 in VB6.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
...

(远不止这些......它会一直持续下去)。请注意,由于我在 IDE 中运行的方式,VB6.EXE 是进程名称,如上所述。它实际上并不是 VB6 本身产生这些异常。它们仅在调用 InitializeComponent() 时出现。


如果我忽略异常,应用程序实际上可以正常运行。所以这可能只是调试环境中的一个问题。但我仍然想深入了解它。

【问题讨论】:

【参考方案1】:

这不是一个完整的答案,但至少是一种解决方法。

调试器处理这些异常的原因是因为我一直在处理一个引用 C++/CLI 项目的 C# 项目,我需要调试后者调用的 C++ 代码。所以我启用了混合模式调试。

关闭它可以消除异常——至少在调试器不再关心它们的意义上。我假设(?)它们可能仍在幕后发生。

VSis shown here的这个特性:

当然,当我再次需要混合模式时,我将不得不重新打开它并忍受异常的性能下降。但至少大多数时候这对我来说是一种进步。

【讨论】:

嗨,@StayOnTarget。这个解决方案能解决您的问题吗?如果解决了,您可以单击“✔”接受它作为答案。有助于社区成员解决类似问题。 @HuiLiu-MFST 不完全,如上所述,这只是一种解决方法,它并没有真正了解为什么会发生异常,也没有真正了解为什么它如此难以调试。

以上是关于如何调试 WPF InitializeComponent() 中抛出的 EEFileLoadException?的主要内容,如果未能解决你的问题,请参考以下文章

如何在设计模式下调试 WPF 用户控件?

如何调试 WPF InitializeComponent() 中抛出的 EEFileLoadException?

调试 WPF:工具和技术

WPF 框架开发 调试和开发 XAML 构建过程的 PresentationBuildTasks 方法

2019-11-29-WPF-依赖属性绑定不上调试方法

WPF 如何知道当前有多少个 DispatcherTimer 在运行