告别硬编码将.NET Core业务逻辑打包成NuGet包供.NET Framework复用当团队同时维护着基于.NET 6的新系统和遗留的.NET Framework 4.7.2项目时如何实现业务逻辑的跨平台共享成为架构设计的痛点。本文将从工程实践角度详细介绍如何通过NuGet包管理实现代码的高效复用。1. 为什么选择.NET Standard作为桥梁在混合技术栈环境中.NET Standard是连接新旧系统的黄金标准。我们曾在一个电商支付系统中将核心交易验证逻辑从.NET 6迁移到.NET Standard 2.0类库使得三个不同的.NET Framework 4.7.2客户端都能调用相同的业务规则。关键优势对比方案维护成本版本控制部署复杂度直接项目引用高困难低文件副本极高不可控中NuGet包引用低精确高实践建议选择.NET Standard版本时建议使用2.0以获得最佳的兼容性平衡它支持.NET Framework 4.6.1和所有现代.NET版本迁移现有代码到.NET Standard库时需要注意避免使用System.Drawing等平台特定API异步方法需兼容Task而非IAsyncResult模式配置文件访问需改用ConfigurationBuilder2. 创建跨平台兼容的NuGet包2.1 项目配置要点在Visual Studio中创建.NET Standard类库后需特别注意csproj文件的配置Project SdkMicrosoft.NET.Sdk PropertyGroup TargetFrameworknetstandard2.0/TargetFramework GeneratePackageOnBuildtrue/GeneratePackageOnBuild PackageVersion1.0.0-alpha/PackageVersion AuthorsYourTeam/Authors Description核心业务逻辑包/Description /PropertyGroup /Project版本控制策略建议主版本号重大架构变更次版本号向后兼容的新功能修订号Bug修复预发布标签-alpha/-beta用于测试2.2 处理平台差异当需要调用平台特定功能时可采用条件编译#if NETFRAMEWORK // .NET Framework专用实现 var timer new System.Timers.Timer(); #else // .NET Core实现 var timer new System.Threading.PeriodicTimer(); #endif3. 搭建私有NuGet仓库3.1 BaGet轻量级方案使用Docker快速部署BaGet私有仓库docker run -d --name baget \ -p 5000:80 \ -v /var/baget:/var/baget \ -e Storage__TypeFileSystem \ -e Storage__Path/var/baget/packages \ loic-sharma/baget:latest访问控制配置在nginx反向代理后添加Basic认证设置IP白名单限制访问启用HTTPS加密传输3.2 Azure Artifacts企业级方案在Azure DevOps中创建Feed的步骤进入Artifacts → Create Feed设置权限层级读者只能下载参与者可推送新包所有者管理权限# 配置认证源 dotnet nuget add source https://pkgs.dev.azure.com/yourorg/_packaging/yourfeed/nuget/v3/index.json -n AzureFeed -u PAT -p 你的个人访问令牌 --store-password-in-clear-text4. 客户端项目集成实践4.1 .NET Framework配置在NuGet.Config中添加私有源configuration packageSources add keyPrivateFeed valuehttp://your-baget-server/v3/index.json / add keynuget.org valuehttps://api.nuget.org/v3/index.json / /packageSources /configuration常见问题排查证书问题在开发机信任自签名证书版本冲突使用bindingRedirects解决程序集冲突依赖解析检查packages.config与PackageReference模式差异4.2 持续集成流水线示例Azure Pipeline配置steps: - task: DotNetCoreCLI2 inputs: command: pack packagesToPack: **/BusinessLogic.csproj versioningScheme: byPrereleaseNumber majorVersion: 1 minorVersion: 0 patchVersion: 0 - task: NuGetCommand2 inputs: command: push packagesToPush: $(Build.ArtifactStagingDirectory)/*.nupkg nuGetFeedType: internal publishVstsFeed: your-feed-name5. 高级维护技巧5.1 符号服务器集成在csproj中添加PropertyGroup IncludeSymbolstrue/IncludeSymbols SymbolPackageFormatsnupkg/SymbolPackageFormat /PropertyGroup调试时在Visual Studio中配置符号源工具 → 选项 → 调试 → 符号添加NuGet.org和私有符号服务器URL5.2 多目标框架支持对于需要同时支持.NET Framework和.NET Core的库TargetFrameworksnetstandard2.0;net472/TargetFrameworks条件编译实践public class PlatformService { public static string GetRuntimeInfo() { #if NET472 return 运行在.NET Framework 4.7.2; #elif NETCOREAPP return 运行在.NET Core; #endif } }在实际项目中我们发现将核心算法封装为NuGet包后不仅解决了技术栈碎片化问题还意外获得了以下收益单元测试覆盖率提升40%因为所有客户端共享同一套实现热修复时间从平均4小时缩短到15分钟只需更新NuGet包版本即可推送到所有客户端。