使用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.Build、Microsoft.Build.Framework和Microsoft.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




