【问题标题】:How to do exception handling in mixed applications? (managed application using unmanaged DLL)如何在混合应用程序中进行异常处理? (使用非托管 DLL 的托管应用程序)
【发布时间】:2011-01-02 20:52:37
【问题描述】:

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

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

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

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

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

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

感谢您的支持!马可

【问题讨论】:

    标签: .net exception-handling clr managed managed-c++


    【解决方案1】:

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

    你可以阅读这个问题:

    Best practice for translating exceptions in C++/CLI wrapper class

    【讨论】:

    • 感谢链接!有趣的阅​​读,在更正指针操作后,我收到了正确的异常。
    【解决方案2】:

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

    【讨论】:

    • 终于找到了 - 一个指针操作,通过位移分配位图颜色 - 来自 '92 和 16 位时代的 MSDN 代码示例。 sigh 导致了一个根本没有使应用程序崩溃的问题,但在很久以后抛出异常(甚至抛出;不带参数)时一直出现问题感谢您的支持!跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2010-11-28
    • 2015-02-15
    • 2016-08-25
    • 2012-01-24
    相关资源
    最近更新 更多