VB.NET Framework4.8 MVC项目缺失Microsoft.Data.SqlClient.SNI.x86.dll求助
我的所有ASP.NET MVC网站突然抛出错误:
System.DllNotFoundException: 无法加载'Microsoft.Data.SqlClient.SNI.x86.dll',找不到该文件。
环境差异:
- VB.NET Framework 4.8的WinForms项目使用
Microsoft.Data.SqlClient完全正常 - 同版本的ASP.NET MVC项目仅在我的个人电脑上失败,测试电脑运行一切正常
测试步骤:
- 创建VB.NET Framework4.8 Web MVC应用
- 添加
Microsoft.Data.SqlClientNuGet包并更新至最新版本 - 在HomeController的Index方法中添加数据库连接代码:
Dim cnn As New SqlConnection("Data Source=MySever;Initial Catalog=MyDb;Persist Security Info=True; Integrated Security=true; application name=abc; Min Pool Size=1; Connection Timeout=30;TrustServerCertificate=True;") cnn.Open()
- 运行应用触发错误
完整HomeController代码:
Imports Microsoft.Data.SqlClient Public Class HomeController Inherits System.Web.Mvc.Controller Function Index() As ActionResult Dim cnn As New SqlConnection("Data Source=MyServer;Initial Catalog=MyDb;Persist Security Info=True; User ID=xx;Password=xx; application name=MyApp; Min Pool Size=1; Connection Timeout=30; TrustServerCertificate=True;") cnn.Open() Return View() End Function Function About() As ActionResult ViewData("Message") = "Your application description page." Return View() End Function Function Contact() As ActionResult ViewData("Message") = "Your contact page." Return View() End Function End Class
关键现象:Bin文件夹中存在Microsoft.Data.SqlClient.SNI.x86.dll和Microsoft.Data.SqlClient.SNI.x64.dll,但进程监视器显示程序未在Bin文件夹中查找该文件。
1. IIS应用程序池位数与DLL不匹配
ASP.NET MVC运行在IIS应用程序池下,如果应用程序池的位数设置与SNI DLL的位数不匹配,会导致系统去错误路径查找文件:
- 若应用程序池启用32位模式,系统优先找x86版本,但可能因IIS搜索路径优先级问题,跳过Bin目录
- 若应用程序池为64位模式,却尝试加载x86 DLL也会触发错误
解决方法:
- 打开IIS管理器,找到对应网站的应用程序池,右键选择「高级设置」
- 调整「启用32位应用程序」选项:
- 若Bin目录同时有x86和x64 DLL,可分别设置为
True或False测试,选择能正常加载的模式
- 若Bin目录同时有x86和x64 DLL,可分别设置为
- 重启应用程序池和网站
2. 全局程序集缓存(GAC)存在冲突版本
如果个人电脑GAC中安装了旧版本或不兼容的Microsoft.Data.SqlClient.SNI程序集,ASP.NET运行时会优先加载GAC中的版本,而非Bin目录内的文件,导致版本不匹配或找不到DLL。
解决方法:
- 以管理员权限打开命令提示符,执行以下命令查看GAC中的SNI程序集:
gacutil /l Microsoft.Data.SqlClient.SNI - 若找到相关条目,执行卸载命令(替换版本号为实际值):
gacutil /u Microsoft.Data.SqlClient.SNI, Version=xxx.xxx.xxx.xxx, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5 - 清理项目Bin和Obj目录,重新生成解决方案
3. ASP.NET影子复制机制导致路径异常
ASP.NET默认启用影子复制,会将Bin目录文件复制到临时目录(如C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files)运行。若复制过程中SNI DLL未被正确同步,就会出现找不到文件的情况。
解决方法:
- 清理临时ASP.NET文件:
- 以管理员权限打开命令提示符,执行:
rmdir /s /q C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\你的网站应用名 - 重启IIS和应用程序池
- 以管理员权限打开命令提示符,执行:
- 可临时在Web.config中禁用影子复制测试(测试后建议改回默认值):
<configuration> <system.web> <hostingEnvironment shadowCopyBinAssemblies="false" /> </system.web> </configuration>
4. NuGet包安装/更新不完整
尽管更新了NuGet包,但ASP.NET项目的包引用可能未正确同步,导致SNI DLL的复制属性未设置正确(WinForms项目默认会复制依赖DLL,但ASP.NET项目存在差异)。
解决方法:
- 卸载
Microsoft.Data.SqlClientNuGet包,清理项目Bin和Obj目录 - 重新安装与测试电脑版本一致的
Microsoft.Data.SqlClient包(不盲目追求最新版) - 检查项目引用中
Microsoft.Data.SqlClient.SNI的属性,确保「复制本地」设置为True - 重新生成项目
5. 本地IIS或.NET Framework环境损坏
测试电脑正常但个人电脑异常,可能是本地.NET Framework或IIS相关组件损坏,导致无法正确加载DLL。
解决方法:
- 修复.NET Framework 4.8:打开「控制面板」→「程序和功能」→找到「Microsoft .NET Framework 4.8」→选择「更改」→点击「修复」
- 重置IIS:以管理员权限打开命令提示符,执行:
iisreset /stop iisreset /start - 安装最新的.NET Framework和IIS相关Windows更新
内容的提问来源于stack exchange,提问作者MojoDK

