是否可以在纯托管代码中生成/生成c0000005访问冲突异常?

时间:2013-01-17 19:07:10

标签: c# .net managed

我认为在.Net中的“纯”托管代码中无法生成/生成访问冲突异常。如果一个人认为.Net是完美的,并且没有使用任何外部库(不管理),例如interop。

我生活在一个幻想中吗?

4 个答案:

答案 0 :(得分:5)

throw new AccessViolationException();

这是纯托管代码,它会产生AccessViolationException:P

答案 1 :(得分:5)

您还可以使用以下代码(但由于输入格式错误,它仅抛出AccessViolationException):

IntPtr ptr = new IntPtr(123);
Marshal.StructureToPtr(123, ptr, true);

答案 2 :(得分:4)

你可以,例如使用可以调用显卡驱动程序的WPF。你可以很容易地获得.NET 4.5之前的AcessViolationExceptions那些带有错误的显卡驱动程序,这些驱动程序并不罕见。

从某种意义上说,你是对的。使用.NET 4.5及更高版本,您将永远不会再在托管代码中获得AccessViolationExceptions,因为.NET运行时不再将来自非托管代码的AccessViolation转换为AccessViolationException,但它会立即终止您的进程。我猜MS支持厌倦了搜索.NET Framework漏洞,却发现它是一个有缺陷的显卡驱动程序。

答案 3 :(得分:2)

你几乎从来没有看到CPU实际上异步抛出一个(在某些东西的中间),因为如果在方法调用中'this'为null,.NET实时编译器通常会引发异常。它将cmp [rcx],rcx置于调用站点以在它可能使用0作为地址之前引发异常。可以使用足够大的字段偏移来读取带有空指针的可读内存,因此可以防止这种情况发生。

请参阅http://blogs.msdn.com/b/oldnewthing/archive/2007/08/16/4407029.aspx

没有魔法,C#就像任何其他编译语言一样成为指令。没有理由对AV永远不会发生的事情感到惬意。