Visual Studio Code编译报错而VS2019正常的原因及差异咨询
我最近遇到了一个挺奇怪的问题:下载了Froala WYSIWIG HTML Editor的.NET SDK,解压后用Visual Studio 2019编译整个解决方案,全程没报错没警告,运行也一切正常。但换到Visual Studio Code里打开同一个解决方案,执行dotnet build编译时,虽然最终编译成功了,却弹出一堆“引用类型‘HttpContext’声明定义于‘System.Web’,但未找到”的错误提示,好在运行起来倒是没毛病。
先说说我的项目结构:
这个解决方案包含三个项目:
- src项目
- demo-core项目(引用了src,我把它设为默认启动项目)
- demo项目(同样引用src,但我没用到它)
后来我查了项目的目标框架配置:
- src项目是多目标框架,同时支持
net472和netstandard2.0 - demo-core项目的目标框架是.NET Core 2.0
折腾了半天,最后我尝试移除了src项目里的net472目标框架,只保留netstandard2.0,结果那些恼人的编译错误立刻就消失了。
来聊聊背后的原因和结论:
为什么VS 2019完全没问题?
VS 2019在处理多目标框架项目时,会智能地根据你选中的启动项目(也就是demo-core,.NET Core 2.0)来匹配最合适的依赖框架版本。它会自动选择src项目的netstandard2.0版本进行编译,直接忽略net472的部分——毕竟.NET Core环境里根本没有System.Web这个库,那是.NET Framework专属的组件,VS 2019的这种自动适配让它避开了这个坑。VS Code为啥会报这些错误?
VS Code依赖的dotnet build命令默认会尝试编译项目的所有目标框架,也就是src里的net472和netstandard2.0都会走一遍。当编译net472版本时,因为我们的运行环境是.NET Core 2.0,可能缺少.NET Framework 4.7.2的相关依赖包,或者dotnet build在跨框架编译时没正确处理引用,导致找不到System.Web里的HttpContext。不过因为实际运行的是基于netstandard2.0的demo-core,所以运行功能不受影响。移除net472对VS Code的影响?
移除src项目的net472目标框架后,dotnet build只会编译netstandard2.0版本,完美匹配demo-core的.NET Core 2.0环境,自然就不会再触发System.Web相关的错误了。而且这个修改完全不影响项目功能,因为你本来就只用到demo-core(.NET Core)相关的部分,netstandard2.0已经能满足跨框架兼容的需求了。
内容的提问来源于stack exchange,提问作者Bronzato

