如何基于MSBuild版本设置条件以调整TargetFrameworks
问题
能否通过设置条件,根据MSBuild自身版本修改项目的TargetFrameworks?我有一个混合了.NET Framework 4.8、NetStandard2和.NET 6类库的解决方案,在Linux主机的Mono环境下通过Rider构建时遇到了矛盾:选择.NET 7的MSBuild 17可以构建.NET Core栈,但无法构建net48类库;选择Mono的MSBuild 15可以构建net48类库,但无法处理.NET 6。我尝试过用以下条件逻辑调整项目文件:
<TargetFrameworks Condition="'$(MSBuildVersion)' == '15'">netstandard2.0;net48</TargetFrameworks> <TargetFrameworks Condition="'$(MSBuildVersion)' != '15'">netstandard2.0;net48;net6</TargetFrameworks>
从逻辑上看,这样应该能让代码正确构建,仅在对应MSBuild版本下忽略net6相关构建。目前我采用的是基于操作系统的判断方式:
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netstandard2.0;net48</TargetFrameworks> <TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">netstandard2.0;net48;net6</TargetFrameworks>
解决方案
完全可以通过MSBuild的条件语法,根据MSBuild版本动态设置TargetFrameworks,而且这种方式比基于操作系统的判断更精准,能直接匹配构建工具的能力:
基于MSBuild版本的条件配置
推荐使用版本范围判断来避免小版本号差异导致的问题(比如Mono的MSBuild 15可能有15.0、15.9等小版本),配置如下:
<TargetFrameworks Condition="'$(MSBuildVersion)' >= '15.0' and '$(MSBuildVersion)' < '16.0'">netstandard2.0;net48</TargetFrameworks> <TargetFrameworks Condition="'$(MSBuildVersion)' >= '16.0'">netstandard2.0;net48;net6</TargetFrameworks>
- 当使用Mono的MSBuild 15.x时,只构建
netstandard2.0和net48,避开.NET 6的构建需求 - 当使用MSBuild 16及以上版本(比如.NET 7配套的MSBuild 17)时,同时构建三个目标框架
两种判断方式的对比
- 基于MSBuild版本:更精准,直接对应构建工具的支持能力,不会因操作系统环境变化(比如Windows上用Mono的MSBuild 15,或Linux上后续出现支持net48的新版MSBuild)而失效
- 基于操作系统:配置更简单,但逻辑不够严谨,存在场景覆盖不全的风险
内容的提问来源于stack exchange,提问作者Keith Jackson
相关产品推荐
相关产品推荐

