当非托管代码或不安全代码尝试对尚未分配的或不具有访问权限的内存进行读写操作时, 会发生访问冲突。 出现这种情况通常是因为指针具有错误的值。 并非所有通过无效指针的读或写操作都会导致访问冲突,所以访问冲突通常指示已经通过无效指针进行多次读或写操作,并且内存内容可能已损坏。 因此, 访问冲突几乎总是指示严重的编程错误。 AccessViolationException 清楚地识别这些严重错误。

在完全由可验证托管代码组成的程序中, 所有引用要么有效要么为 null, 并且不可能访问冲突。 任何尝试在可验证代码中引用空引用的操作都会引发 NullReferenceException 异常。 AccessViolationException 当可验证托管代码与非托管代码或不安全的托管代码进行交互时才会发生。

AccessViolationException 异常只能出现在不安全的托管代码中, 或在可验证托管代码与非托管代码交互时出现:

在不安全的托管代码中发生的访问冲突可以表示为 NullReferenceException 异常 AccessViolationException 或例外, 具体取决于平台。

冒泡到托管代码的非托管代码中的访问冲突始终包装在 AccessViolationException 异常中。

在任一情况下, 都可以识别并更正 AccessViolationException 异常的原因, 如下所示:

确保您尝试访问的内存已分配。 AccessViolationException 异常始终由尝试访问受保护的内存 (即, 用于访问未分配的内存或不属于进程的内存) 引发。

自动内存管理是公共语言运行时提供的服务之一。 如果托管代码与非托管代码提供相同的功能, 你可能希望转到托管代码以利用此功能。 确保您尝试访问的内存未损坏。 如果多次读或写操作时都遇到无效指针,则内存可能已损坏。 当读取或写入预定义缓冲区之外的地址时, 通常会发生这种情况。

HRESULT

AccessViolationException使用 E_POINTER 值为0x80004003的 HRESULT。

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其它信息:尝试读取或写入受保护的内存。这通常指示其它内存已损坏。

错误背景: 操作系统:编程环境:VS2013。 语言:VB.net; 数据库:SQLserver2008 做数据库连接时。发生的错误