2010-01-05 33 views
0

我有一个项目由一个调用C++/CLI DLL的C#应用​​程序组成。如果我在本机代码中有一个Visual Studio C Runtime Library致命错误,似乎无法捕捉它。在(混合).NET代码中捕获C运行时库致命错误?

举个简单的例子,如果我把这个在本地代码:

 
    wchar_t buf[1]; 
    ::wcscpy_s(buf, 1, L"ab"); 

该应用程序会崩溃(在发布版本)。它不会抛出异常,我不能用__try ...__来捕捉它,除非。

我想捕捉这些类型的错误,所以我可以显示一个很好的错误对话框,理想情况下与一个调用堆栈。我决定创建一个小型转储,但我尝试通过在其中一个C++/CLI DLL中调用:: SetUnhandledExceptionFilter()创建一个小型转储,但似乎也无法工作。

有没有办法在.NET应用程序中正常处理C运行时库致命错误?

回答

0

如果您控制了C++代码,那么您可以安装验证处理程序,以使安全字符串函数返回错误而不是中止整个应用程序。见this

一个简单的例子显示,你甚至可以将错误转换为托管异常和退出干净:

#include <stdlib.h> 
#include <string.h> 
using namespace System; 

void InvalidParameterHandler(
    const wchar_t * expression, 
    const wchar_t * function, 
    const wchar_t * file, 
    unsigned int line, 
    uintptr_t pReserved 
) 
{ 
    throw gcnew Exception("Argh"); 
} 

int main(array <System::String ^> ^args) 
{ 
    _set_invalid_parameter_handler(InvalidParameterHandler); 

    try 
    { 
     wchar_t buf[1]; 
     wcscpy_s(buf, 1, L"Hello"); 
    } 
    catch(Exception^ e) 
    { 
     Console::WriteLine(e->ToString()); 
    } 

    return 0; 
}