在托管代码中使用非托管代码时处理错误(c++, C, c++ /CLI, c#)
Handling errors while using unmanaged code in a managed one ( C++, C, C++/CLI, C#)
我正在使用一个写得很差的第三方(C/c++) Api。我从托管代码(c++/CLI)中使用它。有时得到"访问违反错误"。这会使整个应用程序崩溃。我知道我不能处理这些错误[如果指针访问非法内存位置等]。
但我不希望我的应用程序崩溃作为一个整体。至少,如果存在真正的问题,我的应用程序应该优雅地说"OK"。我不能做我的工作了。再见。":-)那么它至少执行一些备选方案,最后关闭自己。
但是似乎没有办法捕获(可能是错误的术语,正确的词可能是被告知)访问冲突和类似的错误。有没有办法让我们知道这些错误。所以我可以执行我的备选方案。
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;
}
如果您确定问题是库中的错误,而不是您传入错误参数的结果,那么最可靠的选择是与加载库的托管进程进行进程间通信。这样你的操作系统进程分离可以防止库拖垮你的应用程序。
您可以尝试使用SEH在进程中捕获访问违规,但是如果库写入野指针而不是简单的空指针,那么即使有异常处理程序,进程也将无法生存。
您的示例不会导致访问冲突,这是堆栈上缓冲区的缓冲区溢出,因此相邻的内存位置包含一些其他有效数据,这些数据被践踏。
相关文章:
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- C++ DLL(不是 CLI)是否可以调用 .NET Core 3.0 委托?
- VS2010 C++ 调试托管 (C++/CLI) DLL
- 如何将 C++/CLI 库链接到C++应用程序
- C++/CLI targetting .NET Core 3.1
- 模板函数签名在 C++/CLI 中解包
- C++/CLI 混合托管/本机 DLL 不起作用
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- DirectX 12 和 C++ CLI :无法使用IID_PPV_ARGS
- 如何为要在 C# 中使用的静态库创建 C++ 或 C++/CLI 包装器
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- C++/CLI -- 访问结构成员
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 如何将CLI类的函数指针作为参数传递给C++方法
- 用于LabView中使用的本机c++的c++/cli dll包装器
- C#WPF和C++/CLI以及C++在C++/CLI中添加外部库错误
- 在.NET Core 3.1中运行托管C++/CLI程序集时,映像格式错误