调用MSBuildWorkspace.OpenProjectAsync时报toolsPath参数不能为空错误
错误成因
该报错的根源是MSBuildWorkspace运行时无法自动定位到本机的MSBuild安装路径,导致内部初始化时传入的toolsPath参数为空。
对于.NET Core/.NET 5+版本的宿主项目,Roslyn的MSBuildWorkspace组件默认不会主动探测系统中的MSBuild位置,如果没有手动注册MSBuild实例,就会触发该空参数错误。
解决方法
- 第一步先为你的项目安装对应的NuGet依赖包:除了已经引用的
Microsoft.CodeAnalysis.MSBuild外,额外安装Microsoft.Build.Locator包。 - 第二步调整业务代码,在创建
MSBuildWorkspace实例之前,先调用MSBuildLocator注册本机的MSBuild实例,修改后的参考代码如下:
using System; using System.Threading.Tasks; using Microsoft.Build.Locator; using Microsoft.CodeAnalysis.MSBuild; namespace RunAllProjects { class Program { static async Task Main() { // 注册MSBuild实例,必须放在MSBuildWorkspace创建逻辑之前执行 if (!MSBuildLocator.IsRegistered) { MSBuildLocator.RegisterDefaults(); } using MSBuildWorkspace ws = MSBuildWorkspace.Create(); var project = await ws.OpenProjectAsync("../../../../1/1.csproj"); Console.WriteLine(project.Name); } } }
- 如果调用
RegisterDefaults仍然报错,可以手动指定MSBuild路径:你可以找到本机VS安装目录下的MSBuild路径(以VS2022社区版为例,默认路径为C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin),调用MSBuildLocator.RegisterMSBuildPath("你本地的MSBuild路径")替代上述的RegisterDefaults方法即可。 - 额外注意:你的运行项目的架构需要和对应MSBuild的架构保持一致,比如MSBuild为x64版本时,不要把你的项目设置为x86运行。
内容的提问来源于stack exchange,提问作者AMWJ
相关产品推荐
相关产品推荐

