.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文件编辑模式
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.</TargetFramework>
</PropertyGroup>
</Project>
我们重点编辑TargetFramework这个节,改为TargetFrameworks,例如:
<PropertyGroup>
<TargetFrameworks>netstandard2.;net451</TargetFrameworks>
</PropertyGroup>
保存后,会提示:
全部重新加载后,新的Project的依赖项是这样的:

这样,这个Project就支持了多个.NET 目标框架,我们可以面向不同的.NET 目标框架添加不同的引用,当然如果依赖的Nuget也同时支持相同的.NET 目标框架,那就最匹配了:例如:Newtonsoft.Json

添加Nuget引用后,Project在不同的.NET 目标框架的引用是这样的:

当然,我们可以为单独为指定的.NET 目标框架添加不同的引用,例如:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup>
<TargetFrameworks>netstandard2.;net451;</TargetFrameworks>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
<ProjectReference Include="..\LibNetFramework\LibNetFramework.csproj" />
</ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<ProjectReference Include="..\LibNetCore\LibNetCore.csproj" />
</ItemGroup> </Project>

参考链接:https://docs.microsoft.com/en-us/dotnet/standard/frameworks
二、. 代码中使用预处理指令同时支持.NET Framework 和 .NET Core
如果同一块业务逻辑,在.NET Framework和.NET Core实现不一样,我们在同一个代码中,如果通过预处理指令实现:
public string UserID
{
get
{
#if NET451
return Convert.ToString(HttpContext.Current.Session["UserID"]);
#elif NETSTANDARD2_0
return httpContext.Session.GetString("UserID");
#endif
}
private set
{
#if NET451
HttpContext.Current.Session["UserID"] = value;
#elif NETSTANDARD2_0
httpContext.Session.SetString("UserID", value);
#endif
}
}
这个地方有个对照表:

这样,代码写完后,编译一下,可以看到有两个文件夹生成:
>------ 已启动全部重新生成: 项目: LibNetCore, 配置: Debug Any CPU ------
>C:\Program Files\dotnet\sdk\3.0.-preview3-\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(,): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview
>LibNetCore -> C:\Users\zhougq\source\repos\LibNetCore\bin\Debug\netstandard2.0\LibNetCore.dll
>------ 已启动全部重新生成: 项目: TestLibrary, 配置: Debug Any CPU ------
>C:\Program Files\dotnet\sdk\3.0.-preview3-\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(,): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview
>TestLibrary -> C:\Users\zhougq\source\repos\TestLibrary\bin\Debug\netstandard2.0\TestLibrary.dll
>TestLibrary -> C:\Users\zhougq\source\repos\TestLibrary\bin\Debug\net451\TestLibrary.dll
========== 全部重新生成: 成功 个,失败 个,跳过 个 ==========
三. 编译生成两个.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的更多相关文章
- 一套代码同时支持.NET Framework和.NET Core
转自:https://www.cnblogs.com/tianqing/p/11614303.html 在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET C ...
- 代码同时支持.NET Framework和.NET Core
代码同时支持.NET Framework和.NET Core .NetCore技术研究-一套代码同时支持.NET Framework和.NET Core 在.NET Core的迁移过程中,我们将原 ...
- .NetCore技术研究-.NET Core迁移前的准备工作
前段时间迁移.NET Core做了大量的试水和评估,今天整理一下分享给大家.大致有以下几个部分: 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主 ...
- 基于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 Core技术研究-通过Roslyn代码分析技术规范提升代码质量
随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...
- .NetCore技术研究-EntityFramework Core 3.0 Preview
前段时间.Net Core 3.0 发布了,Entity Framework Core 3.0 也发布了Preview版.假期用了一上午大致研究了一遍,同时又体验了一把Visual Studio 20 ...
- .NetCore技术研究-ConfigurationManager在单元测试下的坑
最近在将原有代码迁移.NET Core, 代码的迁移基本很快,当然也遇到了不少坑,重构了不少,后续逐步总结分享给大家.今天总结分享一下ConfigurationManager遇到的一个问题. 先说一下 ...
- .NET Core技术研究系列-索引篇
随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...
随机推荐
- 【入门】广电行业DNS、DHCP解决方案详解(一)——历史及现状篇
广电发展历史 单项网络 双向网络 智能网络 广电网络现状 广电网络典型特征 接入技术混杂 承载业务多样化 业务终端错综复杂 其他 网络现状模型 总结 广电发展历史 广电就是广播电视,广电发展可以分为三 ...
- 本地图片上传到GitHub,MarkDown使用Github图片地址
最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...
- unity编辑器扩展_06(给选项添加快捷键,控制菜单是否启用)
代码: [MenuItem("Tools/Delete ", true, 1)] static bool DeleteVadidate() { if (S ...
- CSU1784
题意略. 思路:为了更好地求出一段连续数字的异或和,我们可以用前缀异或和来维护,现在我们只需要考虑每一个在数组中的数字向前异或,且在指定范围内, 异或值为全1的个数有多少个.算出每一个位子能做出的贡献 ...
- Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)
Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...
- Anaconda简单使用手册
安装部分 准备工作 下载各平台对应的安装包,各平台安装包下载链接如下: Windows macOs Linux 安装过程 安装过程在此不给出具体过程,可参照官方给出教程,各平台对应教程如下: Wind ...
- ccflow关于流程引擎的父子流程的基本概念
关键字:驰骋BPM jflow,ccflow, 驰骋工作流引擎 父子流程概念:在管理活动中,通用的部分,公用的部分,可以被重复执行的部分的流程管理活动我们把他独立出来,成为子流程,可以被其他流程的管理 ...
- css3-旋转的太极图
123 body { background-color: #aaa; } .div { width: 400px; height: 400px; border-radius: 50%; border: ...
- 零基础一年拿下BAT三家offer
背景 1.本人本科一本双非垫底的那种,硕士211.本硕电子通信,完全0基础,转行一年. 2.研一上第一学期上课+外派到老师合作公司写MATLAB.去年4月开始学习Java. 起步 1.实话说,刚决定转 ...
- 让Jenkins执行GitHub上的pipeline脚本
本文是<Jenkins流水线(pipeline)实战>系列的第二篇,上一篇搭建好了Jenkins环境并执行了一个简单的pipeline任务,当时我们直接在Jenkins网页上编写pipel ...