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

本文关键字:产生 c0000005 访问冲突 异常 有可能 托管代码 是否 | 更新日期: 2023-09-27 17:53:55

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

我生活在幻想中吗?

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

throw new AccessViolationException();

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

您还可以使用以下代码(它只抛出AccessViolationException,因为输入格式不正确):

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

你可以使用WPF来调用你的显卡驱动程序。在。net 4.5之前,你可以很容易地获得带有显卡驱动程序bug的accessviolationexception,这一点也不罕见。

在某种奇怪的意义上,你是对的。在。net 4.5及以上版本中,你将永远不会在托管代码中获得AccessViolationException,因为。net运行时不再将来自非托管代码的AccessViolation转换为AccessViolationException,但它确实会立即终止你的进程。我猜微软的支持人员已经厌倦了搜索。net框架的bug,却发现它是一个有bug的显卡驱动程序。

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

见http://blogs.msdn.com/b/oldnewthing/archive/2007/08/16/4407029.aspx

没有什么神奇的,c#变成了指令,就像其他编译语言一样。没有理由认为AV永远不会发生。