如何测试AccessViolationException的处理

我需要编写一个测试来validation我的代码可以处理AccessViolationException(或任何其他WIN32损坏状态exception – CSE),它通常通过调用第三方库来处理不安全的上下文。 这应该都是使用C#on .net 4.0完成的。

我发现了这个相关的问题如何处理AccessViolationException和这篇相关的文章http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx ,它解释了如何捕获这些CSE和他们的背景。

所以我想在测试中激发一个WIN32 CSE,以确保在我的应用程序中正确处理。 就像是:

一些要测试的示例类:

public class MyExceptionHandler { [HandleProcessCorruptedStateExceptions] public void HandleCorruptedStateException() { try { //Force genuine unsafe AccessViolationException //not just a throw new AccessViolationException } catch(Exception e) { //Log/cleanup/other } } public void DoesNotHandleCorruptedStateException() { try { //Force genuine unsafe AccessViolationException //not just a throw new AccessViolationException } catch (Exception e) { //Log/cleanup/other } } } 

一个测试:

 class MyTest { [Test] public void ShouldVerifyThatAnAccessViolationExceptionIsHandledCorrectly() { var handler = new MyExceptionHandler(); Assert.DoesNotThrow(() => handler.HandleCorruptedStateException()); } [Test] public void ShouldVerifyThatAnAccessViolationExceptionIsNotHandledCorrectly() { var handler = new MyExceptionHandler(); Assert.Throws(() => handler.DoesNotHandleCorruptedStateException()); } } 

有没有人建议如何在没有太多工作的情况下实现这一目标(例如,编写导致此exception的不安全的lib)。

亲切的问候

更新:为了匹配我的最终解决方案,感谢JaredPar。

 public class MyExceptionHandler { [HandleProcessCorruptedStateExceptions] public void HandleCorruptedStateException() { try { var ptr = new IntPtr(42); Marshal.StructureToPtr(42, ptr, true); } catch(Exception e) { //Log/cleanup/other } } public void DoesNotHandleCorruptedStateException() { try { var ptr = new IntPtr(42); Marshal.StructureToPtr(42, ptr, true); } catch (Exception e) { //Log/cleanup/other } } } 

提示:要从命令行手动使用简单的控制台应用程序validation此操作:

 class Program { static void Main(string[] args) { var handler = new MyExceptionHandler(); if (args.Length > 1) { handler.HandleCorruptedStateException(); } else { handler.DoesNotHandleCorruptedStateException(); } } } 

请尝试以下方法

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

这不能保证通过CLI规范抛出AccessViolationException ,但它会在我所知道的每个平台上抛出

  private static unsafe void AccessViolation() { int* p = (int*)0xFF004324; int q = *p; } 

编辑出不安全的写作。 从该地址读取仍应生成AccessViolationException,除非巧合地在您的地址空间内。