转自:https://www.cnblogs.com/tianqing/p/11614303.html

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

参考链接: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 技术分享。

一套代码同时支持.NET Framework和.NET Core的更多相关文章

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

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

  2. 代码同时支持.NET Framework和.NET Core

    代码同时支持.NET Framework和.NET Core .NetCore技术研究-一套代码同时支持.NET Framework和.NET Core   在.NET Core的迁移过程中,我们将原 ...

  3. 基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用

    由于我们有时候需要在基于.net framework的项目上使用(如Winform端应用),有时候有需要在.net core的项目上使用(如.net core的WebAPI),那么我们把基于SQLSu ...

  4. 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)

    先上地址 Github: https://github.com/purestackorg/pure.ext Gitee: https://gitee.com/purestack/pure.ext 扩展 ...

  5. uni-app高分开源电影项目源码案例分析,支持一套代码发布小程序、APP平台多个平台(前端入门必看)

    uni-app-Video 一个优秀的uni-app案例,旨在帮助大家更快的上手uni-app,共同进步! Features ​ 代码编写简洁,注释清晰,快速入门必备: 支持在线模糊搜索: 程序类目懒 ...

  6. 一套代码小程序&Web&Native运行的探索07——mpvue简单调研

    前言 接上文:[一套代码小程序&Native&Web阶段总结篇]可以这样阅读Vue源码 最近工作比较忙,加之上个月生了小孩,小情人是各种折腾他爸妈,我们可以使用的独立时间片不多,虽然这 ...

  7. 【一套代码小程序&Native&Web阶段总结篇】可以这样阅读Vue源码

    前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一 ...

  8. 一套代码小程序&Web&Native运行的探索05——snabbdom

    接上文:一套代码小程序&Web&Native运行的探索04——数据更新 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/ma ...

  9. 一套代码小程序&Web&Native运行的探索03——处理模板及属性

    接上文:一套代码小程序&Web&Native运行的探索02 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

随机推荐

  1. 导出Wireless组中的成员

    get-adgroupmember -Identity wireless  |export-csv -path C:\Group.csv -Encoding UTF8

  2. kafka spark steam 写入elasticsearch的部分问题

    应用版本 elasticsearch 5.5 spark 2.2.0 hadoop 2.7 依赖包版本 docker cp /Users/cclient/.ivy2/cache/org.elastic ...

  3. MSSS攝影大賽計劃書(第三版)

    比賽內容:對香港的城市風景以及自然風光的攝影 預期成果: 提升同學對香港的認識,鼓勵學生走出大學學園去瞭解香港,同時豐富會員的課餘活動,培養同學的興趣愛好 比賽時間:4月1-15日 最後作品提交時間: ...

  4. Qt OpenCV::Mat与Qt::QImage相互转换

    Mat转QImage QImage mat2qim(Mat & mat) { cvtColor(mat, mat, COLOR_BGR2RGB); QImage qim((const unsi ...

  5. MAVEN实现多环境搭建

    在实际的开发中,会遇到开发环境的不同(开发环境,测试环境,线上环境),会来回根据环境的不同修改配置文件,一不小心修改错误导致无法正常运行,故障排除导致开发效率低.使用maven可以根据环境的不同,自动 ...

  6. 反编译.net下的exe程序

    1. 什么叫.net平台 .NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境..NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的 ...

  7. HDU-6312-Game

    题意: 一个集合里有1到n,两个人轮流从中取数,取出一个数的同时这个数的因子也被取走.取走最后一个数者为胜.判断是否先手必胜. 思路: 一道挺有意思的博弈题.一开始在纸上列出了n为1到6的情况,发现都 ...

  8. Yii2创建管理员登录

    1. 创建管理员表 进入项目根目录,在根目录执行命令: 1 $ ./yii migrate 2. 创建管理的控制器 1 $ cd console/controllers/ 编写代码如下: 123456 ...

  9. JVM笔记(二)

    内存分配1)对象的内存分配,往大的方向讲,就是在堆上分配2)对象优先在Eden分3)大对象直接进入老年代4)长期存活的对象进入老年代:对象在Survivor区每“熬过”一次Minor GC,年数加1, ...

  10. nodejs日常总结

    1.node -v 查看当前node版本 2.npm root -g 查看npm安装路径(还有通过npm安装的vue-cli的路径) 默认: /usr/local/lib/node_modules r ...