【问题标题】:CLI/C++ and C#: How to capture C++ exceptions in Release ModeCLI/C++ 和 C#:如何在发布模式下捕获 C++ 异常
【发布时间】:2012-10-10 08:04:13
【问题描述】:

我有这个问题:

Managed C++ 开始,我使用C# DLL 注册了delegateManaged C++ 中定义的@。 C# 库执行此 delegate 并在其中引发 native exception。在 Debug 模式下,try/catch 会被执行,但在 Release 模式下不会。但在同样的场景下,如果异常是由 100% 托管代码抛出的,我可以捕捉到它。

这是我正在使用的代码:

Managed C++:

class CNativeClass
{
    public:
      int one;
}

// This C method is registred like Delegate in C#
void OnMsgReceived(ManagedObjectInCSharp^ obj)
{
    CNativeClass* pelota;
    pelota->one = 0; // <-- This procude a NullPointerException
    Console::WriteLine(L"OnMsgReceived");
}

我的C# 使用try/catch 执行此delegate。在 Debug 中可以,但在 Release 中则不行。

//But if I defined the method like this:
void OnMsgReceived(ManagedObjectInCSharp^ obj)
{
    try  
    {
        CNativeClass* pelota;
        pelota->one = 0; // <-- This procude a NullPointerException
        Console::WriteLine(L"OnMsgReceived");
    }
    catch(const char* str)
    {
    }
}

我的C#在释放模式下捕获异常。

【问题讨论】:

  • 不要捕获这样的异常,而是修复错误。否则,您无法使用 C++ catch 捕获访问冲突,catch (Exception^ ex) 将全部捕获。
  • 是的,但问题是客户端编写了这个方法并且应用程序不会崩溃!我尝试在方法中使用 catch(Exception^ex) 并且没有捕获到异常!

标签: c# c++ exception


【解决方案1】:

好吧,也许这是一个很长的尝试,但是尝试将此属性添加到您的 C# 方法中:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx

【讨论】:

  • 谢谢!但在 NET 3.5 中不受支持,并且问题仍在继续……这很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2011-07-02
  • 2011-01-26
相关资源
最近更新 更多