不少狀況下,咱們編寫了一些工具庫以後,每每在某些框架版本中會出現一些問題,好比本人最近寫的一個導入導出的工具庫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:
除了特定代碼以外,有時還有特定依賴的包:
慎用新語法糖
好比如下代碼:
精力有限,暫不適配過多框架版本,有興趣的朋友能夠參與進來。