一套代码同时支持.NET Framework和.NET Core

2019 年 10 月 8 日 DotNet

(给DotNet加星标,提升.Net技能


转自: Eric zhou
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文件编辑模式


<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>


我们重点编辑TargetFramework这个节,改为TargetFrameworks,例如:


<PropertyGroup>
<TargetFrameworks>netstandard2.0;net451</TargetFrameworks>
</PropertyGroup>


保存后,会提示:



全部重新加载后,新的Project的依赖项是这样的:



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



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



当然,我们可以为单独为指定的.NET 目标框架添加不同的引用,例如:


<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;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
}
}

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


推荐阅读

(点击标题可跳转阅读)

用C#来守护Python进程

ASP.NET Core IdentityServer4实现第三方登录

Jenkins结合Docker为.NET Core项目实现低配版的CI&CD


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

登录查看更多
0

相关内容

.NET 框架(.NET Framework) 是由微软开发,一个致力于敏捷软件开发、快速应用开发、平台无关性和网络透明化的软件开发平台。
专知会员服务
28+阅读 · 2020年5月20日
【图神经网络(GNN)结构化数据分析】
专知会员服务
114+阅读 · 2020年3月22日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
116+阅读 · 2019年12月31日
微信小程序支持webP的WebAssembly方案
前端之巅
19+阅读 · 2019年8月14日
VS Code Remote发布!真·远程开发
开源中国
6+阅读 · 2019年5月3日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
34个最优秀好用的Python开源框架
专知
9+阅读 · 2019年3月1日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
.NET Core 环境下构建强大且易用的规则引擎
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
微软发布Visual Studio Tools for AI
AI前线
4+阅读 · 2017年11月20日
Deep Reinforcement Learning: An Overview
Arxiv
17+阅读 · 2018年11月26日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Arxiv
8+阅读 · 2018年5月15日
VIP会员
相关资讯
微信小程序支持webP的WebAssembly方案
前端之巅
19+阅读 · 2019年8月14日
VS Code Remote发布!真·远程开发
开源中国
6+阅读 · 2019年5月3日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
34个最优秀好用的Python开源框架
专知
9+阅读 · 2019年3月1日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
.NET Core 环境下构建强大且易用的规则引擎
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
微软发布Visual Studio Tools for AI
AI前线
4+阅读 · 2017年11月20日
Top
微信扫码咨询专知VIP会员