如何才能因为本机C++DLL失败而捕获C#AppCrash

本文关键字:失败 C#AppCrash C++DLL 本机 因为 | 更新日期: 2023-09-27 17:58:20

我有一个从本机c++(比如XYZ.DLL)创建的DLL。我在c++.NET包装器中链接该DLL。该包装器的对象用于我的最高级别c#代码。

我的问题是:有时我的DLL中的一个函数会崩溃,而我的最高级别C#代码会与AppCrash一起崩溃;崩溃模块:XYZ.dll。我正试图弄清楚它在哪里崩溃了我的原生C++代码,但事实证明这是徒劳的。我想知道是否有办法在我的C#代码中发现这个崩溃并继续前进。

如何才能因为本机C++DLL失败而捕获C#AppCrash

我不认为这是您想要的答案,但至少它将有助于解决问题。请查看AppDomain.UnhandledException…您应该能够捕获并记录堆栈跟踪。

这是您正在Visual Studio中调试的东西吗?如果没有,请考虑安装Windows调试器,并在cdb.exe下运行您的应用程序。确保您有非托管组件的符号(.pdb)。如果您在调试器(无论是Visual Studio还是cdb/windbg)下运行应用程序,并且可以重新处理崩溃,那么您应该能够获得堆栈跟踪。既然你暗示你拥有非托管库,我能假设你拥有源代码吗?如果您在VS中,请确保禁用"仅调试我的代码"设置。如果你在风中,那么一旦你命中第一次机会异常,碰撞点应该显示你的堆叠竞速。

你绝对可以"抓住"这个崩溃。

在C++.NET包装器/处理程序中,将所有调用封装到第三方DLL中,用C++try/catch块封装所有调用。这很可能奏效。

如果没有,请切换到使用Windows结构化异常处理。这将捕获本机Win32异常并终止它们。你可以在这里找到Win32文档。