.NET通用Windows程序是.NET Core的子集吗?

9

我有些困惑,因为我读到UWP使用.NET Core,但是在这里有独立的“适用于UWP的.NET” API文档here。此外,在我的UWP项目中找不到一些.NET Core功能。


你有阅读过 .NET 平台标准 吗?这可能会在某种程度上澄清问题。 - yaakov
3个回答

18

简短回答:不是

详细回答:事情比较复杂

  • uap10.0 (UWP)和netcoreapp1.0(跨平台的.NET Core)是竞争的应用程序模型/SDK/平台(微软选择提及的任何术语)。为避免围绕“ .NET Core”一词产生混淆,我在此之后使用目标框架单元(技术术语)。uap10.0聚焦于基于Windows的UI应用程序,而netcoreapp1.0基本上是跨平台的控制台应用程序(像任何程序一样可以作为服务器运行,如ASP.NET)。
  • 超集/子集问题很棘手。它们重叠。 uap10.0实现了netstandard1.4,而netcoreapp1.0实现了netstandard1.6(严格来说,是netstandard1.4的超集) (platform standard documentation)。然而,这两个应用程序模型都向其添加了显着的附加库(uap10.0添加了如Windows.*库之类的内容,而netcoreapp1.0的名称为Microsoft.NETCore.AppNuGet)的库则添加了像不可变集合、网络、文件系统、加密和其他尚未在.NET实现中标准化的东西)。
术语“.NET Core”基本上是错的。运行uap10.0/UWP的CLR源自Silverlight,其将其运行时标记为coreclr。现代跨平台netcoreapp1.0使用从UWP项目派生的CLR。在所有情况下,库都是基于System.Runtime而不是mscorlib。截至2019年8月,uap10.x和netcoreapp3.x之间仍存在相同的差异。但是,它们都实现了netstandard2.x(mono和unity也是如此)。netstandard2.x子集是一个重要的API表面,使得大多数nuget包都与两者兼容。据我所知,winrt API表面的大部分内容将通过其中包含的COM支持(涵盖winrt com和传统COM)对netcoreapp3.x可访问,这使得netcoreapp3.x的交汇处非常重要。计划于2019年晚些时候推出。 netcoreapp3.0还将支持WPF和WinForms以及其他.NET Framework库。这些库将永远不会受到uap10.0的支持。UWP技术堆栈(有几个层次)现在支持任何类型的应用程序(不仅限于uap/winrt)。真正有趣的东西将随着.NET 5和6的推出而来。Java、WebAssembly和Swift互操作性、AOT编译和MonoVM。可访问的库表面和部署位置将会爆炸。

1
一个非常好的深思熟虑的答案,我很想听听您对当前框架的最新解释,以便更容易地应用于当前的下载。如果您还了解即将推出的net core 3.0,那就更棒了。 - Alex KeySmith

14
不,UWP是一个独立的API,它针对不同的窗口模型,并替换了传统WinAPI的大部分内容。您会获得.NET Core依赖项,因为VS中的项目模板选择了它。有很好的理由,您只能从.NET Core获取UWP(通用Windows平台),像手机和Hololens这样的设备没有完整的.NET框架版本可用。在移动应用程序中竞争的尝试是UWP的核心原因。
UWP是基于COM的API,这是它能够使用类似Javascript和C++编程语言的基本原因。否则,以前的COM类型库格式被.winmd替换了。.winmd是一个重度基于.NET元数据格式的文件格式。它可以模拟COM无法支持的功能,如泛型、静态方法和实现继承。所需的“语言投影”,用于获取此仿真,内置于CLR中。他们不能做太多来使异常更好地工作。
您也可以在桌面应用程序中使用UWP API。微软不鼓励这样做,因此您将不会从项目模板中获得任何帮助。使用文本编辑器很容易解决,只需将<TargetPlatformVersion>10.0.10586.0</TargetPlatformVersion>添加到.csproj文件中,现在您可以使用“项目”>“添加引用”并选择UWP合同。方便利用设备命名空间。

1
我不知道你可以在桌面应用程序中使用UWP。有没有其他信息来源,比如限制或其他方面的信息?听起来很棒。 - zastrowm
虽然原帖有点晚了,但是为了解决“从桌面调用UWP”的问题,您可以使用UWP桌面包。https://www.nuget.org/packages/UwpDesktop - Adam Tuliper

10

.NET Core是.NET的跨平台子集,可用于构建适用于Windows、Linux、Mac和UWP的应用程序。

UWP API也是.NET API的一个子集,可在.NET Core上运行。它还具有一些独特于UWP的API。UWP应用程序可以是.NET Core应用程序,但反之则不一定成立。并非所有的.NET Core应用程序都是UWP应用程序。

就像有专门适用于Linux或Mac的.NET Core API一样。


1
.NET Core 不是 .NET Framework 的子集,尽管它们有一些相同的 API,但它们仍然是不同的实现。 - Ammar Shaukat
1
@Ammar - 我说的不是实现,而是API...接口。 - Erik Funkenbusch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接