使用多目標 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
留言
張貼留言