1

是否可以在非托管 DLL 中引发异常并在托管应用程序中处理它?

我的非托管 C++ DLL 会在出现错误时抛出异常,它们应该在调用的可执行应用程序中处理

CMyFileException *x = new CMyFileException;
throw(x);

这以前可行,但现在应用程序使用不同的标志(/clr等)编译,因为我们需要使用一些托管代码。当抛出异常时,我收到一个 System.ExecutionEngineException ,即使在我的调用 exe 中使用 catch(...) 似乎也没有被捕获。

我已经看到编译器选项 /clr 暗示 /EHa 用于异常处理,但据我现在理解,这似乎是选择的选项。

是否有任何其他替代方法(编译器/链接器设置)可以在模块(DLL/exe)边界上抛出和捕获异常?

谢谢你的支持!马可

4

2 回答 2

2

还有其他事情正在发生。当 CLR 发现垃圾收集堆已损坏时,会引发 ExecutionEngineException。当您在托管程序中运行非托管代码时,这并不难。一个简单的缓冲区溢出就足够了。然而,找到错误并不容易。

于 2010-01-11T17:57:22.560 回答
0

可以在非托管代码中抛出异常,但异常最终会被 clr 捕获并将其包装为 SEH 异常。

你可以阅读这个问题:

在 C++/CLI 包装类中翻译异常的最佳实践

于 2010-01-11T16:46:33.203 回答