.net 如何在混合应用程序中进行异常处理?(使用非托管DLL的托管应用程序)

.net 如何在混合应用程序中进行异常处理?(使用非托管DLL的托管应用程序),.net,exception-handling,clr,managed,managed-c++,.net,Exception Handling,Clr,Managed,Managed C++,是否可以在非托管DLL中抛出异常并在托管应用程序中处理它? < P>未管理的C++ >强> DLL在异常情况下抛出异常>,它们在调用可执行的应用程序>中应处理。p> CMyFileException *x = new CMyFileException; throw(x); 这以前是有效的,但是现在应用程序是用不同的标志(/clr等)编译的,因为我们需要使用一些托管代码。当抛出异常时,我收到一个System.ExecutionEngineeException,即使调用exe中有catch(…),

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

< P>未管理的C++ >强> DLL在异常情况下抛出异常>,它们在调用可执行的应用程序>中应<强>处理。p>
CMyFileException *x = new CMyFileException;
throw(x);
这以前是有效的,但是现在应用程序是用不同的标志(/clr等)编译的,因为我们需要使用一些托管代码。当抛出异常时,我收到一个System.ExecutionEngineeException,即使调用exe中有catch(…),它似乎也不会被捕获

我已经看到编译器选项/clr暗示了异常处理的/EHa,但据我现在所知,这似乎是要选择的选项

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


谢谢你的支持!Marco

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

你可以阅读这个问题:


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

最终找到了它-一个指针操作,通过位移位指定位图颜色-来自'92和16位时代的MSDN代码示例。叹气导致了一个根本没有使应用程序崩溃的问题,但是在抛出异常(甚至抛出;没有参数)时,很长一段时间后始终会出现问题。感谢您的支持!谢谢你的链接!有趣的阅读,更正指针操作后,我收到了正确的异常。