Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在纯托管代码中生成/生成c0000005访问冲突异常?_C#_.net_Managed - Fatal编程技术网

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

C# 是否可以在纯托管代码中生成/生成c0000005访问冲突异常?,c#,.net,managed,C#,.net,Managed,我坚信在.Net中的“纯”托管代码中不可能产生/生成访问冲突异常。如果您认为.Net是完美的,并且不使用任何外部库(未被管理),例如interop 我生活在幻想中吗 throw new AccessViolationException(); 这是纯托管代码,它会产生AccessViolationException:p例如,您可以使用WPF调用图形卡驱动程序。在.NET 4.5之前的版本中,如果图形卡驱动程序有问题,则很容易获得AcessViolationExceptions,这一点并不少见 奇

我坚信在.Net中的“纯”托管代码中不可能产生/生成访问冲突异常。如果您认为.Net是完美的,并且不使用任何外部库(未被管理),例如interop

我生活在幻想中吗

throw new AccessViolationException();

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

例如,您可以使用WPF调用图形卡驱动程序。在.NET 4.5之前的版本中,如果图形卡驱动程序有问题,则很容易获得AcessViolationExceptions,这一点并不少见


奇怪的是,你是对的。使用.NET 4.5及更高版本,您将永远不会在托管代码中获得AccessViolationException,因为.NET运行时不再将来自非托管代码的AccessViolationException转换为AccessViolationException,但它会立即终止您的进程。我猜微软的技术支持人员已经厌倦了搜索.NETFramework的bug,结果发现它是一个有bug的图形卡驱动程序

您几乎从未看到CPU实际异步抛出一个(在某个过程中),因为.NET实时编译器通常会在方法调用中如果“this”为null时引发异常。它将
cmp[rcx],rcx
放在调用站点以引发异常,然后才可能使用0作为地址。有可能有足够大的字段偏移量来读取带有空指针的可读内存,所以这可以防止这种情况


没有魔法,C#就像其他编译语言一样变成指令。没有理由对AV将永远不会发生感到舒适。

您也可以使用以下代码(由于输入格式错误,它只会引发AccessViolationException):


实际上.NET使用WinAPI,所以这个异常仍然是可能的,只是有点难以归纳。如果你认为.NET是完美的。。。你可以用任何语言或框架编写糟糕的代码。这是一个聪明而正确的答案,我知道:)也许我需要澄清我的问题。我所说的访问冲突是指来自操作系统的错误,告诉程序它正在读取或写入一个无效的内存地址。呵呵,这只是一个玩笑。除此之外,很难生成但并非不可能。所提到的汇编指令是为callvirt IL指令创建的空检查。这将导致NullReferenceException,而不是AccessViolationException,因为此AV确实发生在托管环境中。当CLR调用非托管代码并从中返回AV时,将抛出AccessViolationException。@AloisKraus Ok,但这是正确的吗?CPU引发页面错误,操作系统接受页面错误,发现该线性地址中没有内存映射,使其成为无效页面错误,并通过异常处理系统将其抛出到用户模式代码中。运行时捕获它并将其作为这两种类型之一提供给托管代码。我以前不知道它能像那样区分他们,但那个设施并没有提供多少好处。这并不是说我要处理不应该在任何地方都以特殊方式发生的托管AV。换句话说,我的意思是,你不应该将任何访问冲突视为正常的代码路径。与页面错误的10k+指令相比,位置良好的“if”的开销可以忽略不计。当你得到一个AV,cmp[ecx],ecx得到的是线性地址,在callvirt中的异常中,ecx只是使线性地址始终为零。当你看到线性地址时,你会说,“哦,好吧,它在零地址。继续。”如果你依赖于它,这是一个糟糕的实现。这是有区别的。当它确实发生时,因为您调用了空对象,CLR确实知道没有任何东西会中断。如果你从外部代码获得AV,它可能会覆盖你一半的内存。第一个是托管代码中的编程错误,该错误是可恢复的。第二个不是,因为您不知道发生了什么。这段代码将产生损坏的状态异常,如果没有其他技巧,无法在try-catch块(int.NET4+)中捕获。这比仅仅抛出新的AccessViolationException()更自然
IntPtr ptr = new IntPtr(123);
Marshal.StructureToPtr(123, ptr, true);