zoukankan      html  css  js  c++  java
  • .NetCore技术研究-一套代码同时支持.NET Framework和.NET Core

    在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET Core。如果线上只有一个小型的应用还好,迁移升级完成后,只需要维护.NET Core这个版本的代码。

    但是,如果是一个大型分布式应用,几百台Server,上千个.NET 应用进程。这种场景下,在一定的时期内,我们需要同时维护.NET Framework和.NET Core两套代码,同一个产品

    特性,需要分别在两套代码中实现,这种代码同步的工作量是非常大的。因此,在这种场景下,有必要使用同一套代码既支持.NET Framework又支持.NET Core.

    带着这个需求场景,我们展开今天的.NET Core技术研究分享。先总结一下整体的思路:

    1. 在Project工程层面支持多个目标框架,面向不同的.NET 目标框架添加不同的引用

    2. 代码中使用预处理指令同时支持.NET Framework 和 .NET Core

    3. 编译生成两个.NET框架的Dll,制作支持多个.NET目标框架的Nuget包

    我们先看第一步:

    一、在Project工程层面支持多个目标框架,面向不同的.NET 目标框架添加不同的引用

    在这个示例代码中,我们使用了.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="..LibNetFrameworkLibNetFramework.csproj" />
    13   </ItemGroup>
    14   
    15   <ItemGroup  Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    16     <ProjectReference Include="..LibNetCoreLibNetCore.csproj" />
    18   </ItemGroup>
    19 
    20 </Project>

     

    参考链接:https://docs.microsoft.com/en-us/dotnet/standard/frameworks

    二、. 代码中使用预处理指令同时支持.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 Filesdotnetsdk3.0.100-preview3-010431SdksMicrosoft.NET.Sdk	argetsMicrosoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview
    1>LibNetCore -> C:Userszhougqsource
    eposLibNetCoreinDebug
    etstandard2.0LibNetCore.dll
    2>------ 已启动全部重新生成: 项目: TestLibrary, 配置: Debug Any CPU ------
    2>C:Program Filesdotnetsdk3.0.100-preview3-010431SdksMicrosoft.NET.Sdk	argetsMicrosoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview
    2>TestLibrary -> C:Userszhougqsource
    eposTestLibraryinDebugnetstandard2.0TestLibrary.dll
    2>TestLibrary -> C:Userszhougqsource
    eposTestLibraryinDebugnet451TestLibrary.dll
    ========== 全部重新生成: 成功 2 个,失败 0 个,跳过 0 个 ==========

    三. 编译生成两个.NET框架的Dll,制作支持多个.NET目标框架的Nuget包

     上个步骤中生成的两个.NET 目标版本的dll,可以分别制作支持多个.NET 目标框架的Nuget包。

     右键Project属性设置中,可以设置Nuget打包

     

       编译工程:Successfully created package 'C:Userszhougqsource eposTestLibraryinDebugTestLibrary.1.0.0.nupkg'.

      使用PackageExplorer编辑生成好的Nuget包:

     

      以上就是本次的.NETCore 技术分享。

    周国庆

    2019/9/30

       

  • 相关阅读:
    Ubuntu实现树莓派交叉编译
    IOS页面自动布局 之 NSLayoutConstraint基础篇
    环信SDK与Apple Watch的结合(3)
    数据结构C语言版干货------->线性表之顺序表
    Java的反射机制(应用篇)
    Java之泛型深解
    Java集合类--->入门下篇
    Java之泛型浅解
    Java集合类--->入门上篇
    数据结构基础铺垫篇000
  • 原文地址:https://www.cnblogs.com/tianqing/p/11614303.html
Copyright © 2011-2022 走看看