.NetCore技術研究-一套代碼同時支持.NET Framework和.NET Core

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

參考連接:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if

這個地方有個對照表:

這樣,代碼寫完後,編譯一下,能夠看到有兩個文件夾生成:

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

相關文章
相關標籤/搜索