如何调试 WPF InitializeComponent() 中抛出的 EEFileLoadException?
Posted
技术标签:
【中文标题】如何调试 WPF InitializeComponent() 中抛出的 EEFileLoadException?【英文标题】:How to debug EEFileLoadException thrown inside WPF InitializeComponent()? 【发布时间】:2021-09-28 03:56:31 【问题描述】:我的 C# 应用程序在 Visual Studio 输出窗口中看到很多 EEFileLoadException
s。我不知道如何获取此异常的任何具体细节。其中有很多,而且当它们发生时似乎会消耗大量运行时间。
我特别想知道的是什么文件加载失败。
如果我打开 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 InitializeComponent() 中抛出的 EEFileLoadException?