在.NET应用程序中显式导致AccessViolationException

Jer*_*oen 2 .net c#

我正在AccessViolationException一个相当大的.NET应用程序中调试一个讨厌的东西(一个取消整个过程,只留下一个事件查看器条目).该应用程序中存在许多令人分心的事情,使根本原因分析变得非常困难.我想有一个"玩具问题"版本,但在(最好)生锈的C++,我很难创建一个死于这种异常的.NET应用程序.

我已经搜索并找到了这个有点老的帖子,它显示了应该抛出我想要的异常的代码.但如果我编译这个:

static unsafe void Main(string[] args)
{
    Console.WriteLine("Doing stuff");

    try
    {
        int foo = (*((int*)0));
    }
    catch (AccessViolationException)
    {
        Console.WriteLine("Don't want to reach this.");
    }

    Console.WriteLine("Waiting");
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

或这个:

static unsafe void Main(string[] args)
{
    Console.WriteLine("Doing stuff");

    try
    {

        int foo;
        int* ip = null;
        foo = *ip; //crash!
    }
    catch (AccessViolationException)
    {
        Console.WriteLine("Don't want to reach this.");
    }

    Console.WriteLine("Waiting");
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

PS.该catch块是那里,因为我的实际我想代表的情况是,我不能捕获的异常或者(这样我就可以不只是throw我自己).

使用"允许不安全代码"选项,在新的.NET控制台应用程序中,它崩溃时出现Null Reference Exception,而不是AccessViolationException.虽然我并不是太惊讶,并且有点理解为什么会这样,但我仍然留下原始问题.

底线:是否有一种简单的方法来创建一个导致AccessViolationException按需的.NET应用程序,最好是在没有异常处理选项的情况下进程完全死亡,只在事件查看器中留下痕迹?

Ant*_*nov 5

替换0(或  null-1 - 它应该触发所需的行为,因为-1,当隐式转换为指针时,导致  0xFFFFFFFF ...通常属于内核模式地址空间(在Windows和*nix中),你不允许从用户模式程序中读取.