基于.NET目标框架的MSBuild条件PackageReference配置问题
.NET Framework多版本兼容类库构建问题与解决方法
概述
我正在构建一个同时兼容.NET Framework 4.0遗留应用和.NET Framework 4.6.1新应用的类库。新增的数据库/Hibernate代码依赖.NET Framework 4.6.1(因NuGet包FluentNHibernate 3.1.0要求该版本及以上),但遗留应用无需此功能。
目标
实现同一代码库与Git主分支编译出兼容两种框架的类库版本,目前已完成以下配置:
- 定义框架适配常量FWK40
- 通过条件设置TargetFrameworkVersion
- 按框架版本排除编译文件
相关.csproj配置如下:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug.Net40|AnyCPU'"> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <DebugSymbols>true</DebugSymbols> <OutputPath>bin\Debug.Net40\</OutputPath> <DefineConstants Condition=" '$(TargetFrameworkVersion)' == 'v4.0'">FWK40</DefineConstants> </PropertyGroup> <ItemGroup> <Compile Include="Database\GeneralSQL.cs" Condition="'$(TargetFrameworkVersion)' != 'v4.0'" /> <Compile Include="Database\NamingStrategy.cs" Condition="'$(TargetFrameworkVersion)' != 'v4.0'" /> </ItemGroup> <ItemGroup> <PackageReference Include="FluentNHibernate" Condition="'$(TargetFramework)' != 'net40'" > <Version>3.1.0</Version> </PackageReference> </ItemGroup>
问题
出现NuGet错误NU1202:FluentNHibernate 3.1.0与net40不兼容。该错误导致MSBuild.exe执行失败,阻碍CI/CD流水线运行,且无法实现PackageReference的条件引入。
已尝试方案
- 使用
$(TargetFrameworkVersion)作为条件,无效; - 按官方文档用
$(TargetFramework)作为条件,仍无效,且未找到该属性具体值,反向条件也无效果; - 手动定义
$(TargetFramework)属性,导致Visual Studio配置管理器失效,项目无法正常加载。
最终解决方法
通过Choose块实现条件引入PackageReference,配置如下:
<PropertyGroup> <IsTargetNet40 Condition=" '$(Configuration)' == 'Debug.net40' ">true</IsTargetNet40> </PropertyGroup> ... <Choose> <When Condition=" '$(IsTargetNet40)' == 'false' "> <ItemGroup> <PackageReference Include="FluentNHibernate" Version="3.1.0" /> <PackageReference Include="FluentMigrator"> <Version>3.3.2</Version> </PackageReference> <PackageReference Include="FluentMigrator.Runner"> <Version>3.3.2</Version> </PackageReference> <PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore"> <Version>7.0.0</Version> </PackageReference> </ItemGroup> </When> </Choose>
内容的提问来源于stack exchange,提问作者Philibert Perusse
相关产品推荐
相关产品推荐

