不少状况下,咱们编写了一些工具库以后,每每在某些框架版本中会出现一些问题,好比本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https://github.com/xin-lai/Magicodes.IE)就出现了如下问题:html
虽然支持标准库2.0,可是经过编写单元测试,确实发现如此:git
所以,单元测试确实须要针对各个框架版本进行测试,而且相关代码须要针对框架进行兼容修改。那么如何实现呢?接下来咱们一步步实践。github
下表定义了最多见的目标框架、如何引用这些框架,以及它们实现的 .NET Standard 版本。 这些目标框架版本是最新的稳定版本。 预览版不会显示。 目标框架名字对象 (TFM) 是一个标准化令牌格式,用于指定 .NET 应用或库的目标框架。app
目标 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.0;netcoreapp2.2;netcoreapp3.1;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[1]; #else return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ?? excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ?? excelPackage.Workbook.Worksheets[0]; #endif
这些“NET461”的符号都有哪些呢?以下所示:编码
目标框架 | 符号 |
---|---|
.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 |
了解了这些知识,咱们就能够编写多框架版本的实现和单元测试了。spa
修改TargetFramework为TargetFrameworks
设置分组
根据目标框架分组:
修复编译错误
执行单元测试
单元测试结果以下图所示:
针对具体的单元测试,咱们还能够指定目标框架进行运行和调试:
结合整改的过程,咱们能够得出如下经验:
如上面所示,左侧代码在net46一、netcoreapp2.2都是没法经过的,格式化的参数模板不一致。
特定框架、平台代码需添加符号判断
以下面示例,默认状况下,.NET Core 不提供除代码页 28591 之外的其余任何代码页编码和 Unicode 编码,例如 UTF-8 和 UTF-16,因此咱们可使用如下代码进行添加,可是须要排除.NET Framework:
除了特定代码以外,有时还有特定依赖的包:
慎用新语法糖
好比如下代码:
精力有限,暂不适配过多框架版本,有兴趣的朋友能够参与进来。