代码同时支持.NET Framework和.NET Core
代码同时支持.NET Framework和.NET Core
.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="..\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
二、. 代码中使用预处理指令同时支持.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
代码同时支持.NET Framework和.NET Core的更多相关文章
- .NetCore技术研究-一套代码同时支持.NET Framework和.NET Core
在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET Core.如果线上只有一个小型的应用还好,迁移升级完成后,只需要维护.NET Core这个版本的代码. 但 ...
- 一套代码同时支持.NET Framework和.NET Core
转自:https://www.cnblogs.com/tianqing/p/11614303.html 在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET C ...
- 基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
由于我们有时候需要在基于.net framework的项目上使用(如Winform端应用),有时候有需要在.net core的项目上使用(如.net core的WebAPI),那么我们把基于SQLSu ...
- 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)
先上地址 Github: https://github.com/purestackorg/pure.ext Gitee: https://gitee.com/purestack/pure.ext 扩展 ...
- .NET Framework VS .NET Core
本文对应的原文来至 c-sharpcorner 的一篇文章,文末有链接.如有错误,还请指正. 前言 你会为你的下一个应用程序选择哪一种开发平台 - .NET Framework 或者 .NET Cor ...
- NET?.NET Framework?.NET Core?
什么是.NET?什么是.NET Framework?什么是.NET Core? https://www.cnblogs.com/1996V/p/9037603.html 什么是.NET?什么是.NET ...
- NET Framework、.NET Core、Xamarin
认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET Core.Xamarin三驾马车 其中.NET Framework是基于Windows平台专属的开 ...
- .net core系列之《.net平台历程介绍以及.net framework和.net core对比》
一..Net平台的背景 1.2010之前 的PC时代的时候,互联网规模还不是特别庞大,以静态编译式语言为代表的JAVA和.Net没什么太大区别,.net以windows自居. 2.2010年以JAVA ...
- [转]浅谈 .NET Framework 与 .NET Core 的区别与联系
本文转自:http://www.cnblogs.com/huchaoheng/p/6295688.html 2017到了,咱们学点啥啊,要想知道学点啥,先弄清.NET Framework 与 .NET ...
随机推荐
- python 进程和线程-进程和线程的比较以及分布式进程
进程和线程的比较 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017631469467456 我们介绍了多进程和多线程,这是实现多任 ...
- Git本地有未提交文件,直接拉取远端最新版本
git pull = git fetch + git merge 1.修改不同的文件: 用户D和用户L在本地提交中修改了不同的文件,如果用户D将改动推送到服务器后,用户L再推送就会遇到非快进式推送错误 ...
- json传的解析,二维数据解析
下载地址:https://share.weiyun.com/447eda75fdd46cb87f6622ecdce4c3ac
- 使用Vue CLI构建Vue项目
第一步:首先在控制台输入vue --version,如果出现版本号则进入第三步:否则进入第二步: 第二步:输入npm install cnpm -g --registry=https://regist ...
- ES6的强大变量声明
ES6是javascript的新特性,今天来说说声明变量 过去我们声明变量,都是一个一个声明,现在有了一种新的声明方式,它可以将一个多个变量同时声明,声明后变量同时存在一个集合中,集合的数据类型是对象 ...
- JS日期处理——月末、季度末
需求: 很多时候对于页面设置默认日期,我们有这样的需求—— 日期频度为月度:如果今天是本月最后一天,默认日期取今天,否则取上月最后一天: 日期频度为季度:如果今天是本季度最后一天,默认日期取今天,否则 ...
- flink PageRank详解(批量迭代的页面排名算法的基本实现)
1.PageRank算法原理 2.基本数据准备 /** * numPages缺省15个测试页面 * * EDGES表示从一个pageId指向相连的另外一个pageId */ public clas ...
- Spark实现分组TopN
一.概述 在许多数据中,都存在类别的数据,在一些功能中需要根据类别分别获取前几或后几的数据,用于数据可视化或异常数据预警.在这种情况下,实现分组TopN就显得非常重要了,因此,使用了Spark聚合函数 ...
- 修改GIT已提交的用户名和邮箱
修改GIT已提交的用户名和邮箱 原文:https://help.github.com/en/github/using-git/changing-author-info 说明 要更改在现有提交中记录的名 ...
- BeyondCompare4完美"破解"
原文:https://blog.csdn.net/weixin_39298366/article/details/84390224 将以下操作保存为bat文件,然后双击运行即可. reg delete ...