.NetCore技术研究-一套代码同时支持.NET Framework和.NET Core

.NetCore技术研究-一套代码同时支持.NET Framework和.NET Core,第1张

概述在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET Core。如果线上只有一个小型的应用还好,迁移升级完成后,只需要维护.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= 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.csproj13   </ItemGroup>14   15   <ItemGroup  netstandard2.0' 16     <ProjectReference Include=..\libNetCore\libNetCore.csproj18   </ItemGroup>19 20 </Project>

 

参考链接:@L_502_0@

二、. 代码中使用预处理指令同时支持.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(); 9 #endif10             }11             private set12 13 14                 httpContext.Current.Session["] = value;15 16                 httpContext.Session.SetString(,value);  17 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-prevIEw1>libNetCore -> C:\Users\zhougq\source\repos\libNetCore\bin\DeBUG\netstandard2.0\libNetCore.dll2>------ 已启动全部重新生成: 项目: Testlibrary,1)">2>C:\Program files\dotnet\sdk\2>Testlibrary -> C:\Users\zhougq\source\repos\Testlibrary\bin\DeBUG\netstandard2.0\Testlibrary.dll2>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

   

总结

以上是内存溢出为你收集整理的.NetCore技术研究-一套代码同时支持.NET Framework和.NET Core全部内容,希望文章能够帮你解决.NetCore技术研究-一套代码同时支持.NET Framework和.NET Core所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1214921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存