在.NET Core的迁移过程当中,咱们将原有的.NET Framework代码迁移到.NET Core。若是线上只有一个小型的应用还好,迁移升级完成后,只须要维护.NET Core这个版本的代码。框架
可是,若是是一个大型分布式应用,几百台Server,上千个.NET 应用进程。这种场景下,在必定的时期内,咱们须要同时维护.NET Framework和.NET Core两套代码,同一个产品分布式
特性,须要分别在两套代码中实现,这种代码同步的工做量是很是大的。所以,在这种场景下,有必要使用同一套代码既支持.NET Framework又支持.NET Core.spa
带着这个需求场景,咱们展开今天的.NET Core技术研究分享。先总结一下总体的思路:code
1. 在Project工程层面支持多个目标框架,面向不一样的.NET 目标框架添加不一样的引用blog
2. 代码中使用预处理指令同时支持.NET Framework 和 .NET Core进程
3. 编译生成两个.NET框架的Dll,制做支持多个.NET目标框架的Nuget包get
咱们先看第一步:同步
1、在Project工程层面支持多个目标框架,面向不一样的.NET 目标框架添加不一样的引用string
在这个示例代码中,咱们使用了.NET Standard 2.0 Class Library Project。 目标框架同时支持.NET Framework 4.5.1和.NET Standard 2.0产品
双击Project, 进入XML文件编辑模式
1 <Project Sdk="Microsoft.NET.Sdk"> 2 <PropertyGroup> 3 <TargetFramework>netstandard2.0</TargetFramework> 4 </PropertyGroup> 5 </Project>
咱们重点编辑TargetFramework这个节,改成TargetFrameworks,例如:
1 <PropertyGroup> 2 <TargetFrameworks>netstandard2.0;net451</TargetFrameworks> 3 </PropertyGroup>
保存后,会提示:
所有从新加载后,新的Project的依赖项是这样的:
这样,这个Project就支持了多个.NET 目标框架,咱们能够面向不一样的.NET 目标框架添加不一样的引用,固然若是依赖的Nuget也同时支持相同的.NET 目标框架,那就最匹配了:例如:Newtonsoft.Json
添加Nuget引用后,Project在不一样的.NET 目标框架的引用是这样的:
固然,咱们能够为单独为指定的.NET 目标框架添加不一样的引用,例如:
1 <Project Sdk="Microsoft.NET.Sdk"> 2 3 <PropertyGroup> 4 <TargetFrameworks>netstandard2.0;net451;</TargetFrameworks> 5 </PropertyGroup> 6 7 <ItemGroup> 8 <PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> 9 </ItemGroup> 10 11 <ItemGroup Condition=" '$(TargetFramework)' == 'net451' "> 12 <ProjectReference Include="..\LibNetFramework\LibNetFramework.csproj" /> 13 </ItemGroup> 14 15 <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' "> 16 <ProjectReference Include="..\LibNetCore\LibNetCore.csproj" /> 18 </ItemGroup> 19 20 </Project>
参考连接:https://docs.microsoft.com/en-us/dotnet/standard/frameworks
2、. 代码中使用预处理指令同时支持.NET Framework 和 .NET Core
若是同一块业务逻辑,在.NET Framework和.NET Core实现不同,咱们在同一个代码中,若是经过预处理指令实现:
1 public string UserID 2 { 3 get 4 { 5 #if NET451 6 return Convert.ToString(HttpContext.Current.Session["UserID"]); 7 #elif NETSTANDARD2_0 8 return httpContext.Session.GetString("UserID"); 9 #endif 10 } 11 private set 12 { 13 #if NET451 14 HttpContext.Current.Session["UserID"] = value; 15 #elif NETSTANDARD2_0 16 httpContext.Session.SetString("UserID", value); 17 #endif 18 } 19 }
这个地方有个对照表:
这样,代码写完后,编译一下,能够看到有两个文件夹生成:
1>------ 已启动所有从新生成: 项目: LibNetCore, 配置: Debug Any CPU ------ 1>C:\Program Files\dotnet\sdk\3.0.100-preview3-010431\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview 1>LibNetCore -> C:\Users\zhougq\source\repos\LibNetCore\bin\Debug\netstandard2.0\LibNetCore.dll 2>------ 已启动所有从新生成: 项目: TestLibrary, 配置: Debug Any CPU ------ 2>C:\Program Files\dotnet\sdk\3.0.100-preview3-010431\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview 2>TestLibrary -> C:\Users\zhougq\source\repos\TestLibrary\bin\Debug\netstandard2.0\TestLibrary.dll 2>TestLibrary -> C:\Users\zhougq\source\repos\TestLibrary\bin\Debug\net451\TestLibrary.dll ========== 所有从新生成: 成功 2 个,失败 0 个,跳过 0 个 ==========
三. 编译生成两个.NET框架的Dll,制做支持多个.NET目标框架的Nuget包
上个步骤中生成的两个.NET 目标版本的dll,能够分别制做支持多个.NET 目标框架的Nuget包。
右键Project属性设置中,能够设置Nuget打包
编译工程:Successfully created package 'C:\Users\zhougq\source\repos\TestLibrary\bin\Debug\TestLibrary.1.0.0.nupkg'.
使用PackageExplorer编辑生成好的Nuget包:
以上就是本次的.NETCore 技术分享。
周国庆
2019/9/30