使用多目標 TargetFrameworks 來讓 net72 可參考 .netstandard2.1 通過編譯並可使用

前言

先前,在 .NET Standard 2.1 推出之時,微軟官方就已經宣告不支援 .NET Framework 4.8,且 .NET Framework 4.8 也被宣告為 Windows 上的最後一版的 .NET Framework,未來有任何新增功能(也許為了微服務/非同步/OSS…)等一些更進階的場景、也許透過語言支援、也許透過 Runtime Compiler 來支援,但是這些功能未來只會在 .NET Core 3.x 以後的版本中出現,也不會再像以前一樣,更新回 .NET Framework 裡。

這對開發人員來說,也許是壞消息、但也許是好消息。

在.NET Standard 2.1 中大約增加大約 3k 的 API,簡而言之、.NET Standard 2.1 增加了許多是 .NET Core 2.0 開始支援的 API,像是 ValueTask<T>、Span<T>、還包括許多在 .NET Core 2.1 & Xamarin & Unity 才支援的型別。

更詳細的資訊可直接參考 terrajobst 的 Github:

https://github.com/dotnet/standard/blob/master/docs/versions/netstandard2.1.md

也就是說,從 .NET Standard 2.1 開始,只支援在 .NET Core 3.0/Mono 5.4/Xamarin.iOS 12.16 … 等 以上的版本中使用,然而 .NET Framework 4.8 不再表列之中… 沒錯!就是不再表列之中,就是沒有!

圖(一)、All .NET Standard Versions

圖片來自:https://github.com/dotnet/standard/blob/master/docs/versions.md

實際的測試下,如果你開一個 net472 的 Console 專案來參考 .NET Standard 2.1 的類別庫時,你連編譯都無法編譯。

圖(二)、根本無法編譯

有一種解決方案就是使用多目標編譯方式來通過編譯。


多目標編譯使用方式可參考下方:


<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup> <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
     <RootNamespace>ApiPortVS</RootNamespace>    <DefineConstants>$(DefineConstants);VS2019</DefineConstants>
   </PropertyGroup>
... 略

更詳細的說明請參考官方資料:https://docs.microsoft.com/zh-tw/nuget/create-packages/multiple-target-frameworks-project-file

要注意的是,多目標只支援新版格式的 .csproj 專案格式。

再來就是多目標 <TargetFramework> 必須使用 <TargetFrameworks> 而不是 <TargetFramework> 唷。

使用 Visual Studio 2019 只需要在專案上點兩下就可直接編輯 .csproj 專案檔。

我編輯完畢後的情況如下:

圖(三)、多目標 Multi-TargetFrameworks

設定完成後,Visual Studio 2019 會提示必須重新 Reload 所有專案、這時點選 Yes 即可。

這時再重新編譯會發現,成功編譯了!

圖(四)、終於成功的編譯


參考資料:

https://devblogs.microsoft.com/dotnet/announcing-net-standard-2-1/

https://github.com/dotnet/standard/milestone/3

https://github.com/dotnet/standard/blob/master/docs/versions.md

https://github.com/dotnet/standard/blob/master/docs/versions/netstandard2.1.md

留言

這個網誌中的熱門文章

軟體工程師 - 成長的 10 個階段

常見的程式碼壞味道(Code Smell or Bad Smell)

什麼是 gRPC ?