.NET Framework 4.7.2网站通过MSBuild无法解析.NET Standard 2.0引用
解决无.csproj的.NET Framework 4.7.2网站引用.NET Standard 2.0类库的MSBuild构建问题
首先明确:.NET Framework 4.7.2是完全支持引用.NET Standard 2.0类库的,Visual Studio里的运行和调试正常不是显示错误,问题出在无csproj的Web Site项目(区别于Web Application项目)在命令行MSBuild/CI环境下的依赖解析逻辑上——这类项目没有csproj文件来管理NuGet依赖,VS会自动补全这些依赖,但命令行MSBuild不会。
下面是具体的解决步骤:
1. 给Web Site项目添加NETStandard.Library的NuGet依赖
因为Web Site没有csproj,我们需要手动创建/修改packages.config文件:
- 在网站根目录创建
packages.config(如果不存在的话),写入以下内容:<?xml version="1.0" encoding="utf-8"?> <packages> <package id="NETStandard.Library" version="2.0.3" targetFramework="net472" /> </packages> - 这一步是告诉MSBuild,网站需要NETStandard.Library包来解析.NET Standard 2.0的依赖。
2. 修改MSBuild命令,确保先还原依赖再构建
命令行下MSBuild不会自动还原NuGet包,所以要在构建前加上还原步骤:
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" "[Path to Solution]\AT3.sln" /t:Restore;Build /p:TargetFramework=net472
/t:Restore;Build:先执行NuGet还原,再执行构建/p:TargetFramework=net472:显式指定目标框架,避免MSBuild混淆
3. 修正Web.config中的程序集绑定重定向
你之前在
<runtime>节点下添加绑定重定向,确保netstandard程序集被正确解析:<configuration> <!-- 其他配置节点 --> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> </assemblyBinding> <!-- 其他绑定重定向 --> </runtime> </configuration>
4. 临时替代方案:生成临时csproj用于构建(如果上述方法无效)
如果不想完全把Web Site转为Web Application,可以临时生成csproj用于CI构建:
- 在Visual Studio中右键网站项目,选择Convert to Web Application Project,生成对应的csproj文件
- CI环境中用这个csproj来构建网站,本地开发仍可保留原Web Site结构(注意同步修改代码时要兼顾两者)
为什么VS里正常但命令行不行?
Visual Studio针对Web Site项目做了特殊处理,会自动注入.NET Standard相关的依赖和绑定重定向,但命令行MSBuild没有这个逻辑,必须手动配置依赖和重定向才能正确解析netstandard程序集。
内容的提问来源于stack exchange,提问作者Jack




