如何使 C# 应用程序因 AccessViolationException 而崩溃

How to make C# application crash with an AccessViolationException

如何在 c# 中使用 AccessViolationException 故意使应用程序崩溃?

我有一个使用非托管 DLL 的控制台应用程序,最终由于访问冲突异常而崩溃。因此,我需要故意抛出一个 AccessViolationException 来测试它在某些情况下的行为。

除此之外,它必须是一个特定的 AccessViolationException 因为这个异常不是由 catch 块处理的。

令人惊讶的是,这不起作用:

public static void Crash()
{
    throw new AccessViolationException();
}

这两者都不是:

public static unsafe void Crash()
{
    for (int i = 1; true; i++)
    {
        var ptr = (int*)i;
        int value = *ptr;
    }
}

这是 "native" 方式 - 虽然 @Storm 方法是 100% 确定性的。技巧是尝试写入远离当前指针的内存。 IE。即使我在我的程序中分配了 4 个字节,接下来的几千个字节仍然在为我的程序保留的内存部分。射远了,应该能拿到。

int[] array = new int[1];
fixed (int* ptr = array)
{
      ptr[2000000] = 42;
}

确定性方法是让 Windows 为您抛出它:

来自 Петър Петров 的回答:How to make C# application crash

[DllImport("kernel32.dll")]
static extern void RaiseException(uint dwExceptionCode, uint dwExceptionFlags,  uint nNumberOfArguments, IntPtr lpArguments);

void start()
{
    RaiseException(0xC0000005, 0, 0, new IntPtr(1));
}