.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= 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=..LibNetFrameworkLibNetFramework.csproj13 </ItemGroup> 14 15 <ItemGroup netstandard2.0' 16 <ProjectReference Include=..LibNetCoreLibNetCore.csproj18 </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(); 9 #endif 10 } 11 private set 12 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 Filesdotnetsdk3.0.100-preview3-010431SdksMicrosoft.NET.SdktargetsMicrosoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: 你正在使用 .NET Core 的预览版。请查看 https://aka.ms/dotnet-core-preview 1>LibNetCore -> C:UserszhougqsourcereposLibNetCorebinDebugnetstandard2.0LibNetCore.dll 2>------ 已启动全部重新生成: 项目: TestLibrary,1)">2>C:Program Filesdotnetsdk2>TestLibrary -> C:UserszhougqsourcereposTestLibrarybinDebugnetstandard2.0TestLibrary.dll 2>TestLibrary -> C:UserszhougqsourcereposTestLibrarybinDebugnet451TestLibrary.dll ========== 全部重新生成: 成功 2 个,失败 0 个,跳过 0 个 ========== 三. 编译生成两个.NET框架的Dll,制作支持多个.NET目标框架的Nuget包 ?上个步骤中生成的两个.NET 目标版本的dll,可以分别制作支持多个.NET 目标框架的Nuget包。 ?右键Project属性设置中,可以设置Nuget打包 ? ? ?编译工程:Successfully created package 'C:UserszhougqsourcereposTestLibrarybinDebugTestLibrary.1.0.0.nupkg'. ? 使用PackageExplorer编辑生成好的Nuget包: ? ? 以上就是本次的.NETCore 技术分享。 ? 周国庆 2019/9/30 ? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – ‘System.Web.UI.WebControls.TextBo
- asp.net – 如何使用Response.OutputStream.Writ
- asp-classic – 为ServerXMLHTTP请求设置超时
- ASP.NET MVC – 将外部模型传递给编辑器模板
- asp.net-mvc – 如何用ASP.NET MVC命令查询责任分
- asp.net-mvc-4 – 高级WebGrid教程或解决方案
- asp.net – 无法加载文件或程序集“Oracle.DataA
- asp.net-mvc – MVC3如何在ViewModel中将多个复选
- asp.net-mvc – ASP.net MVC验证钩
- asp.net-mvc – 如何测试Asp.Net MVC视图是否无异