TFS 2017构建报错:调用Invoke传2个参数触发Microsoft.Build.Shared异常
这种问题我之前碰到过好几次,核心原因基本都是VS2017安装后,代理机器上的MSBuild版本被“抢占”了,导致构建过程调用了和项目不兼容的MSBuild实例。先把你提到的错误信息贴出来方便参考:
Exception calling "Invoke" with "2" argument(s): "The type initializer for 'Microsoft.Build.Shared.F..."
下面是我亲测有效的排查和解决步骤:
先确认当前使用的MSBuild版本
在构建脚本里加一行命令:msbuild -version,运行后看输出的路径和版本号。如果显示的是VS2017自带的MSBuild(路径通常是C:\Program Files (x86)\Microsoft Visual Studio\2017\<你的版本>\MSBuild\15.0\Bin),那就是版本优先级的问题。指定明确的MSBuild路径
最简单的解决办法是直接在构建任务里调用之前正常工作的MSBuild绝对路径。比如如果之前用的是.NET Framework自带的版本,路径一般是C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe,把构建命令改成这个路径,强制使用兼容的版本。调整环境变量优先级
如果不想修改构建脚本,可以调整代理机器的系统环境变量:- 打开系统属性的环境变量设置
- 找到
PATH变量,把原来正常的MSBuild所在路径移到最前面 - 重启代理服务,让环境变量生效
检查项目兼容性(如果需要用VS2017的MSBuild)
如果你确实要基于VS2017构建,那得检查项目文件:- 用VS2017打开你的Hello World项目,让它自动更新项目的构建配置
- 确认项目的目标框架版本、构建工具版本和VS2017兼容
- 保存项目后再重新提交构建
清理MSBuild缓存
有时候缓存文件会导致奇怪的初始化错误,试试删除代理机器上的%LOCALAPPDATA%\Microsoft\MSBuild目录,然后重新运行构建,让MSBuild重新生成缓存。
内容的提问来源于stack exchange,提问作者Sameer

