为什么访问冲突异常不能被 捕获.NET4.0.
Why AccessViolationException cannot be caught by .NET4.0
以下
C# 代码将在 上崩溃,这真的很有趣。NET4.0 但在 .NET2.0.
C# 代码
class Program
{
static void Main(string[] args)
{
try
{
ExceptionTest();
Console.WriteLine("Done!");
}
catch (Exception e)
{
Console.WriteLine("Error !!!");
Console.WriteLine(e.Message);
}
}
[DllImport("badapp")]
private static extern int ExceptionTest();
}
C++代码
extern "C" __declspec(dllexport) int ExceptionTest()
{
IUnknown* pUnk = NULL;
pUnk->AddRef();
return 0;
}
如果针对 编译上述 C# 代码。NET2.0,一切正常。仅针对 .NET4.0 将使它在运行时崩溃。
我怀疑系统异常捕获机制已更改。NET4.0. 有什么想法吗?
是的,它在 .NET 4 中发生了变化。无法捕获指示损坏状态的异常。这是因为几乎无法保证在引发损坏状态异常时可以执行任何操作。实际上没有理由希望状态损坏的进程继续执行。
为了与旧代码兼容,可以通过将 legacyCorruptedStateExceptionsPolicy
元素添加到 app.config 来更改此行为。
还可以通过标记要捕获这些异常的方法,方法是使用 HandleProcessCorruptedStateExceptions 属性标记要捕获这些异常的方法,从而逐个执行此操作。
[HandleProcessCorruptedStateExceptions]
public static unsafe int LenghtPoint(this IntPtr point)
{
//por optimizar
byte* bytePoint = (byte*)point.ToPointer();
byte auxByte;
int length = 1;
bool encontrado = false;
while (!encontrado)
{
try
{
auxByte = bytePoint[length];
length++;
}
catch (System.AccessViolationException)
{
length--;
encontrado = true;
}
}
return length;
}
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 当类定义不可见时捕获异常
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 在 lambda 捕获中声明的变量的类型推导
- RtlCaptureStackBackTrace未捕获任何帧
- 如何在Qt中取消捕获字符串
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 如何将strftime中的格式错误作为异常捕获
- 在Linux下捕获SIGKILL的C++程序
- 按值捕获引用时出现非常量
- 捕获lambda中的std::数组
- 由cin中的字符串中未捕获空白引起的分割错误
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 为什么访问冲突异常不能被 捕获.NET4.0.