最近碰到一个问题,同样一套代码,在有的机器上能成功编译,有的机器上编译失败。初步对比,编译失败的机器装的是vs2019,成功的机器是vs2015。在失败的机器上将vs2019、vs2013卸载,重启后安装vs2015,问题仍然没有解决。
编译失败,但是error数是0。仔细查看输出和警告,会发现以下关键信息:
4>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3275: 未能解析主引用“xxx.xxx.xxx”,因为它对程序集“Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”具有间接依赖关系,而该程序集是针对“.NETFramework,Version=v4.5”框架生成的。该框架版本高于当前目标框架“.NETFramework,Version=v4.0”。
未能解析主引用“xxx.xxx.xxx”,因为它对程序集“Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”具有间接依赖关系,而该程序集是针对“.NETFramework,Version=v4.5”框架生成的。该框架版本高于当前目标框架“.NETFramework,Version=v4.0”
在google上受到此篇文章(https://blog.csdn.net/youbl/article/details/39080729)启发,用everything把C盘所有Newtonsoft.json.dll删掉后问题解决了!将回收站中所有dll还原一步步排查,发现罪魁祸首是C:\Program Files\IIS\Microsoft Web Deploy V3\Newtonsoft.Json.dll。
进一步通过google深究其中原理,找到此篇文章(https://stackoverflow.com/questions/50638711/msbuild-is-replacing-newtonsoft-json-dll-with-an-older-version)。这里的最佳答案的解释是,MSBuild在编译过程中要解析程序集引用,会从一些奇怪的目录下查找dll,包括"C:\Program Files\IIS\Microsoft Web Deploy V3\",这个目录下的Newtonsoft.Json.dll版本与项目的要求(9.0.0.0)一致,但是没有校验它的.netFramework,导致编译失败。
想了解更详细的,请阅读参考链接:
https://blog.csdn.net/youbl/article/details/39080729