Dot-Net

.NET for Universal Windows Program 是 .NET Core 的子集嗎?

  • October 15, 2020

我的困惑是我讀到 UWP 使用 .NET Core,但這裡有一個單獨的“.NET for UWP”API文件。另外,我在我的 UWP 項目中找不到一些 .NET Core 功能。

直接回答:不,不是!

長答案:這很複雜

  • uap10.0(UWP) 和netcoreapp1.0(跨平台 .NET Core) 是相互競爭的應用程序模型/SDK/平台(無論微軟接下來選擇提及什麼術語)。我從這裡開始使用目標框架名稱(技術術語)以避免與術語“.NET Core”混淆。uap10.0專注於基於 Windows 的 UI 應用程序,netcoreapp1.0基本上是跨平台的控制台應用程序(與任何程序一樣可以執行伺服器,如 ASP.NET)。
  • 超集/子集問題很棘手。它們重疊。uap10.0實現netstandard1.4netcoreapp1.0實現netstandard1.6(這是一個嚴格的超集netstandard1.4)(平台標准文件)。但是,兩種應用程序模型都向其中添加了重要的附加庫(uap10.0例如添加Windows.*庫,而被netcoreapp1.0呼叫的庫Microsoft.NETCore.AppNuGet)添加了諸如不可變集合、網路、文件系統、密碼學和其他在 .NET 中尚未標準化的東西。實現)。
  • 術語“.NET Core”基本上是搞砸了。執行uap10.0/UWP 的 CLR 派生自 Silverlight,它標記了它的 runtime coreclr。現代跨平台netcoreapp1.0使用從 UWP 項目派生的 CLR。對於在所有情況下都是System.Runtime基於而不是mscorlib基於的庫也是如此。

2019 年 8 月更新

  • uap10.x到目前為止,和之間仍然存在相同的區別netcoreapp3.x。但是,它們都實現了netstandard2.x(單聲道和統一也是如此)。該netstandard2.x子集是一個重要的 API 表面,使大多數 nuget 包與兩者兼容。
  • 據我了解,winrt API 界面的很大一部分將可以netcoreapp3.x通過其包含的 COM 支持訪問(包括 winrt com 和傳統 COM)。這使得netcoreapp3.x交叉點非常重要。這計劃在 2019 年晚些時候進行。
  • netcoreapp3.0還將支持 WPF 和 WinForms 以及其他 .NET Framework 庫。永遠不會支持這些uap10.0
  • UWP 技術堆棧(有幾層)現在支持對任何類型的應用程序進行打包/儲存處理(不僅僅是 uap/winrt 一次)。
  • 真正有趣的東西來自 .NET 5 和 6。Java、WebAssembly 和 Swift 互操作、AOT 編譯和 MonoVM。可訪問的庫表面和部署位置將爆炸。

不,UWP 是一個獨特的 api,它針對不同的視窗模型,取代了大部分傳統的 winapi。您會獲得一個 .NETCore 依賴項,因為 VS 中的項目模板選擇了它。有充分的理由,您只能從 .NETCore 獲得 UWP(通用 Windows 平台)中的 U,手機和 Hololens 等設備沒有可用的完整 .NET 框架版本。試圖在移動應用程序中保持競爭力是 UWP 的核心原因。

UWP 是基於 COM 的 api,這是它與 Javascript 和 C++ 等語言一起使用的基本原因。否則隱藏得很好,COM 的傳統類型庫格式被 .winmd 取代,這種格式在很大程度上基於 .NET 的元數據格式。它可以模擬 COM 無法支持的特性,如泛型、靜態方法和實現繼承。獲得此仿真所需的*語言投影內置於 CLR。*為了讓異常更好地工作,他們無能為力。

您也可以在桌面應用程序中使用 UWP api。Microsoft 不鼓勵這樣做,因此您無法從項目模板中獲得幫助。使用文本編輯器輕鬆修復,添加<TargetPlatformVersion>10.0.10586.0</TargetPlatformVersion>到您的 .csproj 文件,現在您可以使用 Project > Add Reference 並選擇 UWP 契約。方便利用設備命名空間。

引用自:https://stackoverflow.com/questions/38680266