日期:2014-05-17  浏览次数:21343 次

C#纯托管代码是否可能出现System.AccessViolationException异常呢?
如果C#代码里面没有调用任何的native函数或者模块,也没有用safe模块去操作内存指针,
那么有没有什么样的代码可能会导致System.AccessViolationException异常呢?

能给出一个简单的示例代码么?

------解决方案--------------------
Marshal也可以操作内存。
因此,可以:

Marshal.ReadByte(IntPtr.Zero); // will throw AccessViolationException


------解决方案--------------------
当非托管或不安全代码尝试读写未分配或不具有访问权限的内存空间时,就会产生访问冲突。 这种情况通常因为指针具有错误的值而发生。 并非所有通过错误指针的读写操作都会引发访问冲突,所以访问冲突通常指示已经通过错误指针进行多次读写操作,并且内存内容可能已损坏。 因此,访问冲突几乎总是指示存在严重的编程错误。 在 .NET Framework 2.0 版中,AccessViolationException 清楚地标识了这些错误。

在完全由可验证托管代码组成的程序中,所有引用都有效或者为空,因而不会产生访问冲突。 AccessViolationException 只在可验证托管代码与非托管代码或非安全托管代码交互时才会引发。