2010-01-05 32 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; 
}