![](/img/trans.png)
[英]Unable to compile managed c# code within unmanaged c++ code using cli layer
[英]Handling errors while using unmanaged code in a managed one ( C++, C, C++/CLI, C#)
我正在使用寫得很糟糕的第 3 方 (C/C++) Api。 我從托管代碼(C++/CLI)中使用它。 有時會出現“訪問沖突錯誤”。 這會導致整個應用程序崩潰。 我知道我無法處理這些錯誤[如果指針訪問非法 memory 位置等我該怎么辦]。
但我不希望我的應用程序整體崩潰。 至少如果有一個真正的問題,我的應用程序應該優雅地說“OK.I can't do my job.BYE.”:-) 然后它至少執行一些替代方案並最終關閉自己。
但是似乎沒有辦法捕獲(可能是錯誤的術語,正確的詞可能是被告知)訪問沖突和類似的錯誤。有沒有辦法被告知這些錯誤。 所以我可以執行我的替代方案。
PS:標准異常處理並不能解決這個問題。
#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace std;
static void ThrowingManagedException()
{
throw gcnew ArgumentException("For no good reason");
}
static void ThrowingNativeException()
{
throw std::exception("For no good reason");
}
static void SomeBadThingsHappen()
{
short a[1];
a[0]=1;
a[2]= 2; // SomeOne make stupid mistake
}
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Test Exceptions");
try
{
SomeBadThingsHappen();
//ThrowingNativeException();
//ThrowingManagedException();
}
catch(Exception^ e)
{
Console::WriteLine("Something awful happened: "+ e);
}
Console::WriteLine("Press enter to exit");
Console::Read();
return 0;
}
如果您確定問題是庫中的錯誤,而不是由於您傳入了錯誤的 arguments,那么您最可靠的選擇是與加載庫的托管進程進行進程間通信。 這樣,您的操作系統進程分離可以防止庫導致您的應用程序崩潰。
您可以嘗試使用 SEH 在進程中捕獲訪問沖突,但如果庫寫入野指針而不是簡單的 null 指針,那么即使使用異常處理程序,該進程也將無法生存。
您的示例不會導致訪問沖突,它是堆棧上緩沖區的緩沖區溢出,因此相鄰的 memory 位置包含其他一些被踩踏的有效數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.