.NET Framework4.8网站加载.NET Standard2.0类库SqlClient依赖异常求助
.NET Framework 4.8 Web Site 引用EF Core 3.1 .NET Standard类库故障解决方案
核心原因
ASP.NET Web Site(非Web Application项目)使用传统的非SDK式生成逻辑,没有项目文件的情况下,NuGet不会自动递归解析.NET Standard类库的传递依赖,也不会自动识别复制平台特定的原生资源dll,这是依赖不进bin、SqlClient系列报错的根本原因,所有配置都可以通过现有文件完成,不需要转换项目格式。
操作步骤
1. 清理环境,统一依赖版本
- 卸载之前为了编译勉强安装的重复NuGet包,清空网站
bin目录下所有手动复制的非项目输出dll,避免版本冲突 - 在Web Site项目的NuGet包管理器中,安装和内部.NET Standard类库引用版本完全一致的以下包,不需要重复安装多版本:
Microsoft.EntityFrameworkCore3.1.x(版本号和类库中的EFCore版本严格对齐)Microsoft.EntityFrameworkCore.SqlServer3.1.x(会自动拉取对应版本的Microsoft.Data.SqlClient基础包)Microsoft.Data.SqlClient.SNI和SqlClient版本匹配的正式稳定版,不要使用预览版
所有包版本必须和内部类库的引用版本100%一致,版本不一致会直接导致加载失败
2. 补全缺失的SNI原生dll
你找不到Microsoft.Data.SqlClient.SNI.x64.dll是因为这个原生dll默认存放在NuGet包的runtime目录中,Web Site项目不会自动复制,按以下路径取文件即可:
- 打开本地NuGet缓存默认路径:
C:\Users\[你的系统用户名]\.nuget\packages\microsoft.data.sqlclient.sni\[你安装的SNI包版本号]\runtimes - 路径下
win-x64\native、win-x86\native文件夹分别存放64位、32位版本的SNI dll - 根据你站点的应用程序池运行位数,把对应dll直接复制到网站
bin目录根目录,不要建子文件夹;如果不确定运行位数,把两个版本的dll都复制到bin目录即可
3. 配置web.config解决平台兼容和绑定问题
所有原需要写在csproj里的兼容配置,全部写到web.config中即可:
- 配置程序集绑定重定向,解决dll版本冲突,在
<configuration>节点下添加以下内容,版本号替换为你实际安装的版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Data.SqlClient" publicKeyToken="23ec7fc2d6eaa4a5" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-[你的SqlClient版本号]" newVersion="[你的SqlClient版本号]" /> </dependentAssembly> <!-- 其余EFCore相关dll的绑定重定向如果NuGet安装时未自动生成,按相同格式补充即可 --> </assemblyBinding> </runtime>
- 关闭影子拷贝解决平台识别错误,在
<system.web>节点下添加以下配置:
<hostingEnvironment shadowCopyBinAssemblies="false" />
这一步是解决
Microsoft.Data.SqlClient is not supported on this platform报错的核心:Web Site默认开启的bin目录程序集影子拷贝机制,无法正确识别.NET Standard依赖的平台适配逻辑,关闭后会直接从bin目录加载正确的程序集。
验证
清理解决方案后重新生成,访问调用EF Core的功能模块即可。如果仍有加载错误,直接查看Windows事件查看器中ASP.NET分类的错误日志,定位具体缺失/版本不匹配的dll,补充对应文件或调整绑定重定向即可。
内容的提问来源于stack exchange,提问作者API
相关产品推荐
相关产品推荐

