我认为在.Net中的“纯”托管代码中无法生成/生成访问冲突异常。如果一个人认为.Net是完美的,并且没有使用任何外部库(不管理),例如interop。
我生活在一个幻想中吗?
答案 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永远不会发生的事情感到惬意。