Magicodes.IE编写多框架版本支持和执行单元测试
背景
很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https://github.com/xin-lai/Magicodes.IE)就出现了以下问题:
虽然支持标准库2.0,但是通过编写单元测试,确实发现如此:
因此,单元测试确实需要针对各个框架版本进行测试,并且相关代码需要针对框架进行兼容修改。那么如何实现呢?接下来我们一步步实践。
.NET框架版本说明
最新目标框架版本
下表定义了最常见的目标框架、如何引用这些框架,以及它们实现的 .NET Standard 版本。 这些目标框架版本是最新的稳定版本。 预览版不会显示。 目标框架名字对象 (TFM) 是一个标准化令牌格式,用于指定 .NET 应用或库的目标框架。
目标 Framework | 最新 稳定版本 | 目标框架名字对象 (TFM) | 已实现 .NET Standard 版本 |
---|---|---|---|
.NET Standard | 2.1 | netstandard2.1 | 不可用 |
.NET Core | 3.0 | netcoreapp3.0 | 2.1 |
.NET Framework | 4.8 | net48 | 2.0 |
支持的目标框架版本
目标框架通常由 TFM 引用。 下表显示 .NET Core SDK 和 NuGet 客户端支持的目标框架。 等效项显示在括号内。 例如,win81
对于 netcore451
来说等效于 TFM。
目标 Framework | TFM |
---|---|
.NET Standard | netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1 |
.NET Core | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 |
.NET Framework | net11 net20 net35 net40 net403 net45 net451 net452 net46 net461 net462 net47 net471 net472 net48 |
Windows 应用商店 | netcore [netcore45] netcore45 [win] [win8] netcore451 [win81] |
.NET Micro Framework | netmf |
Silverlight | sl4 sl5 |
Windows Phone | wp [wp7] wp7 wp75 wp8 wp81 wpa81 |
通用 Windows 平台 | uap [uap10.0] uap10.0 [win10] [netcore50] |
如何让工程支持多个框架?
以单元测试工程为例:
<PropertyGroup>
<TargetFrameworks>netcoreapp3.;netcoreapp2.;netcoreapp3.;net461</TargetFrameworks>
<IsPackable>false</IsPackable>
</PropertyGroup>
如上述代码所示,我们可以通过“TargetFrameworks”元素来定义多个框架。那么如何在工程里面添加条件判断以进行编译呢?
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
除了工程里面,我们代码中如何针对不同的框架版本编写代码呢?
#if NET461
return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
excelPackage.Workbook.Worksheets[];
#else
return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
excelPackage.Workbook.Worksheets[];
#endif
这些“NET461”的符号都有哪些呢?如下所示:
完整的 .NET Core 目标框架的预处理器符号列表
目标框架 | 符号 |
---|---|
.NET Framework | NETFRAMEWORK , NET20 , NET35 , NET40 , NET45 , NET451 , NET452 , NET46 , NET461 , NET462 , NET47 , NET471 , NET472 , NET48 |
.NET Standard | NETSTANDARD , NETSTANDARD1_0 , NETSTANDARD1_1 , NETSTANDARD1_2 , NETSTANDARD1_3 , NETSTANDARD1_4 , NETSTANDARD1_5 , NETSTANDARD1_6 , NETSTANDARD2_0 , NETSTANDARD2_1 |
.NET Core | NETCOREAPP , NETCOREAPP1_0 , NETCOREAPP1_1 , NETCOREAPP2_0 , NETCOREAPP2_1 , NETCOREAPP2_2 , NETCOREAPP3_0 , NETCOREAPP3_1 |
Magicodes.IE之多框架版本测试
了解了这些知识,我们就可以编写多框架版本的实现和单元测试了。
单元测试添加多框架支持
修改TargetFramework为TargetFrameworks
设置分组
根据目标框架分组:
修复编译错误
执行单元测试
单元测试结果如下图所示:
针对具体的单元测试,我们还可以指定目标框架进行运行和调试:
总结和经验分享
结合整改的过程,我们可以得出以下经验:
- 单元测试编写时的异常消息判断尽量使用字符串包含判断,而不判断完整格式。
如上面所示,左侧代码在net461、netcoreapp2.2都是无法通过的,格式化的参数模板不一致。
特定框架、平台代码需添加符号判断
如下面示例,默认情况下,.NET Core 不提供除代码页 28591 以外的其他任何代码页编码和 Unicode 编码,例如 UTF-8 和 UTF-16,所以我们可以使用以下代码进行添加,但是需要排除.NET Framework:
除了特定代码之外,有时还有特定依赖的包:
慎用新语法糖
比如以下代码:
精力有限,暂不适配过多框架版本,有兴趣的朋友可以参与进来。
Magicodes.IE编写多框架版本支持和执行单元测试的更多相关文章
- Jquery3.x高版本支持IE8
最近在做项目的时候,遇到一个安全漏洞的问题 检测到目标站点存在javascript框架库漏洞 解决办法是 将受影响的javascript框架库升级到最新版本. 好吧,就给你升吧,升完之后,我的天啊,尽 ...
- 自主研发异步通信框架Minma(支持长连接和短连接)
Minma是英文Minma Is Not Mina的简称 该框架采用Java NIO的核心技术,实现了基于事件驱动的多线程异步通信框架,支持常见的长连接(腾讯QQ)和短连接(http通信) 对于开发人 ...
- New!Devexpress WPF各版本支持VS和SQL Server版本对应图
点击获取DevExpress v19.2.3完整版试用下载 本文主要为大家介绍DevExpress WPF各大版本支持的VS版本和支持的.Net版本图,Devexpress WPF v19.2.3日前 ...
- New!Devexpress WinForms各版本支持Visual Studo和SQL Server版本对应图
点击获取DevExpress v19.2.3最新完整版试用下载 本文主要为大家介绍DevExpress WinForms各大版本支持的VS版本和支持的.Net版本图,Devexpress WinFor ...
- 推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐一个比较好用的流媒体服务开源代码: ZLMediaKit: 实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 https://gitee.com/xiahcu/Z ...
- 手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...
https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 距离上一次给小伙伴们汇报简易 ...
- 一个C#开发编写Java框架的心路历程
前言 这一篇絮絮叨叨,逻辑不太清晰的编写Java框架的的一个过程,主要描述我作为一个java初学者,在编写Java框架时的一些心得感悟. 因为我是C#的开发者,所以,在编写Java框架时,或多或少会带 ...
- 现在有哪些浏览器的哪些版本支持 HTML5
现在有哪些浏览器的哪些版本支持 HTML5 1.IE IE9支持部分 IE10+支持2.Firefox Firefox3.5,3.6支持大部分 Firefox4.0+支持3.Chrome Chrome ...
- iis7下.Net框架版本设置
转载:http://blog.163.com/fan_yishan/blog/static/47692213201391651229542/ Win7下IIS网站的.Net框架版本设置 步骤/方法 1 ...
随机推荐
- behavior planning——15.cost function design weightTweaking
Designing cost functions is difficult and getting them all to cooperate to produce reasionable vehic ...
- H3C UDP封装
- js获取dom节点
var s= document.getElementById("test");del_ff(s); //清理空格var chils= s.childNodes; //得到s的全部子 ...
- Python--day23--初识面向对象复习
面向对象编程是大程序编程思想:
- set和map容器、
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- Laravel 5.* 执行seeder命令出现错误的解决方法
最近在使用Laravel开发一个项目,测试中需要增加数据库基础数据动作,当第一次执行完`php artisan db:seed` 后,增加新的seeder文件时执行会报错.错误信息如下`[Reflec ...
- Capistrano:自动完成多台服务器上新版本的同步更新,包括数据库的改变
https://baike.baidu.com/item/Capistrano/6844928?fr=aladdin Capistrano是一种在多台服务器上运行脚本的开源工具,它主要用于部署we ...
- 【codeforces 764C】Timofey and a tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 如何通过命令行 msbuild 编译项目
本文告诉大家如何通过 msbuild 编译一个项目,通过命令行编译可以输出更多的编译信息,可以用来调试自己写的编译相关方法,可以看到是哪个文件编译失败 在开始菜单可以找到 VisualStudio 的 ...
- mysql导出csv/sql/newTable/txt的方法,mysql的导入txt/sql方法...mysql备份恢复mysqlhotcopy、二进制日志binlog、直接备份文件、备份策略、灾难恢复.....................................................
mysql备份表结构和数据 方法一. Create table new_table_nam备份到新表:MYSQL不支持: Select * Into new_table_name from old_t ...