You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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环境,避免硬编码路径:

  1. 安装NuGet包Microsoft.Build.Locator
  2. 在构建代码最开始添加初始化逻辑:
// 定位并注册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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:00:36