我需要编写一个测试来验证我的代码能否处理AccessViolationException(或其他WIN32损坏状态异常 - CSE),这通常是在不安全的上下文中调用第三方库引起的。所有这些都应该在.NET 4.0上使用C#完成。
我发现了这个相关问题如何处理AccessViolationException和这篇相关文章http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx,其中解释了如何捕获这些CSE及其背景。
因此,我想在测试中触发WIN32 CSE,以确保正确处理我的应用程序。类似于:
要测试的一些示例类:
我发现了这个相关问题如何处理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<AccessViolationException>(() => handler.DoesNotHandleCorruptedStateException());
}
}
有没有人有什么建议,可以在不费太多力气的情况下实现这个目标(例如编写一个不安全的库来引发此异常)。
敬礼
更新:为了匹配我的最终解决方案,感谢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
}
}
}
提示: 要手动验证此内容,请使用一个简单的控制台应用程序,在命令行中执行:
TIP: 要手动验证此内容,请使用一个简单的控制台应用程序,在命令行中执行:
class Program
{
static void Main(string[] args)
{
var handler = new MyExceptionHandler();
if (args.Length > 1)
{
handler.HandleCorruptedStateException();
}
else
{
handler.DoesNotHandleCorruptedStateException();
}
}
}