问题描述:
应用程序崩溃,或安装 Visual Studio 2013年或.NET Framework 4.5.1 后,使用 System.Data.SqlClient,则会出现"AccessViolationException"异常
EF使用System.Data.SqlClient也会报内存访问非法异常。
异常堆栈4种,仅列一种:
<Module>.SNIAddProvider(SNI_Conn*, ProviderNum, Void*) SNINativeMethodWrapper.SNIAddProvider(System.Runtime.InteropServices.SafeHandle, ProviderEnum, UInt32 ByRef) System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean, Boolean, Boolean ByRef) System.Data.SqlClient.TdsParser.Connect(System.Data.SqlClient.ServerInfo, System.Data.SqlClient.SqlInternalConnectionTds, Boolean, Int64, Boolean, Boolean, Boolean) System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(System.Data.SqlClient.ServerInfo, System.String, Boolean, System.Data.ProviderBase.TimeoutTimer, System.Data.SqlClient.SqlConnection) System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(System.Data.SqlClient.ServerInfo, System.String, Boolean, System.Data.SqlClient.SqlConnection
解决方法:
netsh winsock reset catalog
微软的解决方法:
若要变通解决此问题,请尝试以下方法:
- 卸载非 IFS Bsp 或 Lsp。若要执行此操作,请使用下列方法之一:
- 卸载在系统上安装了非 IFS BSP 或 LSP的应用程序。
- 在命令提示符处运行以下命令:
netsh winsock remove provider <id>
注意在此命令中,"目录条目 Id"值为非-IFS LSP 时运行下面的命令显示的 <id> 表示:
netsh winsock show catalog
- 卸载.NET Framework 4.5.1。
注意如果在系统上安装了 Visual Studio 2013,此选项不适用。
原理:
由于一些非-IFS Winsock 基础服务提供商 (Bsp) 或分层服务提供程序 (Lsp) 安装在系统上截取和更改的传入和传出网络通信,则会出现此问题。因此,当应用程序连接到 SQL Server 时,这些 Bsp 或 Lsp 干扰 Winsock 通讯,造成内存访问非法。