能否在.NET 6与.NET Framework NuGet包间共享通用代码?
解决方案
方案一:拆分发布通用类库,让依赖自动传递
- 把通用类库A单独打包发布到你的自有NuGet服务器,注意A的目标框架选**.NET Standard 2.0**——这个版本同时兼容.NET Framework 4.6.2和.NET 6,是跨框架通用代码的最优选择。
- 修改类库B(.NET 6)和C(.NET Framework 4.6.2)的项目文件,将A作为项目引用,并配置打包时自动包含依赖声明:
<ItemGroup> <ProjectReference Include="..\A\A.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </ProjectReference> </ItemGroup> - 用
dotnet pack命令或者Visual Studio的“生成NuGet包”功能打包B和C,此时它们的NuGet包会自动带上对A的依赖。后续应用引用B/C时,NuGet会自动下载A包,自然就能访问通用代码。
方案二:用多目标框架的单一类库替代拆分方案
- 不用单独建B和C,直接改造通用类库A的项目文件,设置同时支持两个目标框架:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net462;net6.0</TargetFrameworks> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup> </Project> - 通用代码直接放在这个类库里,如果有少量框架专属逻辑,用条件编译区分:
public class Utility { public void CommonLogic() { // 跨框架通用代码 } public void FrameworkSpecific() { #if NET462 // .NET Framework 4.6.2 专属逻辑 #elif NET6_0 // .NET 6 专属逻辑 #endif } } - 直接打包这个多目标类库发布到NuGet服务器,无论是.NET 6还是.NET Framework 4.6.2的应用,引用这个单一包就能访问所有通用代码,框架专属逻辑也会自动适配运行环境。
方案三:将通用代码嵌入到B/C包中(不推荐)
- 如果不想单独发布A包,可以在B/C的项目文件里配置,把A的编译输出嵌入到自身程序集:
<ItemGroup> <ProjectReference Include="..\A\A.csproj"> <EmbedInteropTypes>true</EmbedInteropTypes> </ProjectReference> </ItemGroup> - 这种方式会让B/C包体积变大,且A的代码会被重复打包到两个包里,后续修改A需要重新打包B/C,维护成本高,仅适合临时场景。
内容的提问来源于stack exchange,提问作者Kieran
相关产品推荐
相关产品推荐

