使用Microsoft.Build.BuildManager编译时提示找不到Microsoft.CSharp.Core.targets
解决MSBuild 17.x程序化构建找不到Roslyn目标文件的问题
核心原因
升级NuGet版MSBuild到17.x后,它不再自动关联Visual Studio安装目录中的SDK和Roslyn组件,导致构建时无法找到Microsoft.CSharp.Core.targets这类依赖文件。以下是具体修复方案:
方案1:手动指定SDK与Roslyn路径(直接有效)
在全局属性中添加MSBuildSDKsPath和RoslynTargetsPath,指向Visual Studio 2022的对应安装路径:
var visualStudioPath = @"C:\Program Files\Microsoft Visual Studio\2022\Community"; // 根据你的VS版本调整(Community/Professional/Enterprise) var globalProperty = new Dictionary<string, string>() { // 保留原有属性 { nameof(DTOBuildGlobalProperty.OutDir), BuildGlobalProperty.OutDir }, { nameof(DTOBuildGlobalProperty.Platform), BuildGlobalProperty.Platform }, { nameof(DTOBuildGlobalProperty.Configuration), BuildGlobalProperty.Configuration }, { nameof(DTOBuildGlobalProperty.TargetFramework), BuildGlobalProperty.TargetFramework }, // 添加关键路径属性 { "MSBuildSDKsPath", Path.Combine(visualStudioPath, @"MSBuild\Sdks") }, { "RoslynTargetsPath", Path.Combine(visualStudioPath, @"MSBuild\Current\Bin\Roslyn") } };
注意:原代码中把
clean混入TargetFramework属性是错误的,clean是构建目标,应放在BuildRequestData的目标数组中(见下方修正)。
方案2:修正构建目标传递
确保clean目标正确放入构建请求的目标列表,而非属性中:
var brequest = new BuildRequestData(path , globalProperty , null , new string[] { "Clean", BuildGlobalPropertyTargetToBuild.Restore.ToString(), BuildGlobalProperty.TargetToBuild.ToString() } , null);
建议构建顺序:先执行Clean清理旧文件,再Restore还原依赖,最后执行目标构建。
方案3:使用MSBuildLocator自动定位(更灵活)
通过Microsoft.Build.Locator包自动定位本地MSBuild环境,避免硬编码路径:
- 安装NuGet包
Microsoft.Build.Locator - 在构建代码最开始添加初始化逻辑:
// 定位并注册Visual Studio 2022的MSBuild实例 var vsInstance = MSBuildLocator.QueryVisualStudioInstances() .FirstOrDefault(i => i.Version.Major == 17); if (vsInstance != null) { MSBuildLocator.RegisterInstance(vsInstance); } var pc = new ProjectCollection(); // 自动使用定位到的MSBuild环境
这种方式会自动关联VS的SDK和Roslyn组件,无需手动配置路径。
额外注意事项
- 保留
BuildManager.DefaultBuildManager.ResetCaches()调用,确保每次构建无缓存干扰 - 检查
OutDir等路径属性是否为绝对路径,避免相对路径导致的文件查找错误
内容的提问来源于stack exchange,提问作者Starnuto di topo
相关产品推荐
相关产品推荐

