You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Microsoft.Build加载含ExcludeAssets的csproj时属性不被识别,求解决方案

解决加载带ExcludeAssets的PackageReference的csproj时的异常问题

这个问题的核心原因很明确:你尝试使用的MSBuild版本(2.0/4.0/12.0)根本不认识ExcludeAssets这类NuGet PackageReference属性。这些旧版本的MSBuild是在NuGet原生集成PackageReference之前发布的(PackageReference从MSBuild 15.0,也就是VS2017开始才被原生支持),所以加载包含这类属性的项目时必然会抛出识别异常。

下面是具体的解决步骤:

  • 升级到支持PackageReference的MSBuild版本
    你必须使用MSBuild 15.0或更高版本(对应VS2017及以后)。如果你的工具项目是.NET Framework 4.7.2,直接引用系统自带的旧MSBuild程序集是不行的,正确的做法是在你的工具项目中安装NuGet包:Microsoft.BuildMicrosoft.Build.FrameworkMicrosoft.Build.Utilities.Core,建议选择和你当前使用的Visual Studio版本匹配的版本(比如VS2022对应17.x系列)。

  • 修正csproj的ToolsVersion设置
    打开报错的csproj文件,确保开头的ToolsVersion设置为15.0或更高,比如:

    <Project ToolsVersion="17.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    

    这会告诉MSBuild使用对应的新版工具集来解析项目。

  • 确保项目启用PackageReference支持(针对非SDK风格的.NET Framework项目)
    如果你的csproj不是SDK风格的传统.NET Framework项目,需要手动添加配置让MSBuild识别PackageReference相关属性:

    <PropertyGroup>
      <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
    </PropertyGroup>
    
  • 加载项目时显式指定ToolsVersion
    在代码中加载项目时,可以显式指定使用的MSBuild版本,避免默认使用旧版本:

    var projectCollection = new ProjectCollection();
    projectCollection.DefaultToolsVersion = "17.0"; // 替换为你安装的MSBuild版本
    var project = projectCollection.LoadProject(@"你的项目路径\YourProject.csproj");
    

按照以上步骤操作后,MSBuild就能正确识别ExcludeAssets属性,不会再抛出异常了。

内容的提问来源于stack exchange,提问作者Ricardo Rocha

火山引擎 最新活动