在.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