如何让NuGet包同时支持.NET 6与.NET Framework 4.7.2
NuGet包同时支持.NET 6与.NET Framework 4.7.2的配置方案
直接修改SDK风格类库项目的配置即可,不需要新建多个项目拆分代码,步骤如下:
- 编辑项目文件配置多目标框架
右键你的类库项目,选择「编辑项目文件」,找到原有的单框架配置节点<TargetFramework>net6.0</TargetFramework>,将单数的TargetFramework改为复数的TargetFrameworks,用分号分隔两个目标框架的标识,其中.NET Framework 4.7.2的标识为net472,配置示例如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!-- 多目标框架列表,按需求增减框架标识即可 --> <TargetFrameworks>net6.0;net472</TargetFrameworks> <!-- 你原有的包版本、作者名、输出配置等内容全部保留,不需要修改 --> <Nullable>enable</Nullable> <PackageId>OnePlatforms.AWU</PackageId> <Version>对应你的包版本号</Version> </PropertyGroup> </Project>
- 处理跨框架代码兼容差异
如果你的代码中使用了.NET 6专属API、.NET Framework 4.7.2没有对应实现的逻辑,直接用条件编译符号隔离不同框架的专属代码即可,不需要拆分独立项目:- 标记.NET 6专属代码块:用
#if NET6_0和#endif包裹 - 标记.NET Framework 4.7.2专属代码块:用
#if NET472和#endif包裹 - 两个框架通用的代码不需要加任何标记,会自动编译到两个目标版本中
代码示例:
- 标记.NET 6专属代码块:用
public static class RuntimeHelper { public static string GetCurrentRuntimeInfo() { #if NET6_0 // .NET 6下的专属实现 return System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; #elif NET472 // .NET Framework 4.7.2下的兼容实现 return $".NET Framework {Environment.Version}"; #endif } }
- 处理框架专属依赖
如果不同目标框架需要引用不同的NuGet依赖包,直接给包引用加目标框架判断条件即可,示例配置:
<ItemGroup> <!-- 所有框架通用的依赖,直接写在ItemGroup下,不需要加条件 --> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <!-- 仅.NET 6需要引用的依赖,加Condition判断 --> <PackageReference Include="System.Text.Json" Version="8.0.0" Condition="'$(TargetFramework)' == 'net6.0'" /> <!-- 仅.NET Framework 4.7.2需要引用的依赖 --> <PackageReference Include="System.ValueTuple" Version="4.5.0" Condition="'$(TargetFramework)' == 'net472'" /> </ItemGroup>
- 打包验证
配置完成后,执行dotnet pack命令或者右键项目选择「打包」,生成的NuGet包会自动包含两个目标框架的编译产物,.NET 6项目、.NET Framework 4.7.2的WinForms项目安装包时,NuGet会自动匹配对应框架的程序集,不会出现运行时不兼容的问题。
注意:如果代码中用到了.NET 6独有的语法特性(比如init-only属性、required成员、文件级命名空间等),.NET Framework 4.7.2编译时会报错,可以通过引入兼容包、条件编译隔离、调整兼容写法三种方式解决。
内容的提问来源于stack exchange,提问作者Omer Huseyin GUL
相关产品推荐
相关产品推荐

