.NET平台标准中的平台是什么?

时间:2016-02-16 01:06:53

标签: c# .net windows dnx .net-core

目前正在尝试了解.NET平台标准我发现自己对于不同平台的想法非常困惑"。

我试着说清楚我的观点。我目前对.NET Framework的看法是,.NET粗略地说是由CLR,BCL和支持软件组成,用于引导CLR并提供虚拟机和底层操作系统之间的接口。

因此,当我们使用.NET Framework进行编码时,我们的目标确实是针对某个版本的框架,因为我们在BCL中使用的类型来自框架,因此依赖于特定的版本。

现在,根据我的理解,.NET Core完全不同。并非所有人都挤在一起。我们有CoreCLR,它是运行IL的轻量级VM,CoreFX是正确组织为NuGet包的库,我们到目前为止还提供DNX / DNVM / DNU,它们提供了支持,例如启动CoreCLR并与之连接。 OS。

无论如何,尽管我们在Windows 7,Windows 8或Windows 10上安装了该框架,但我们会根据框架进行编码。

现在,在.NET Platform Standard规范中,我们看到以下定义:

  

平台 - 例如.NET Framework 4.5,.NET Framework 4.6,Windows Phone 8.1,MonoTouch,UWP等

此外,我们还会看到一个平台列表,其中包括

  • .NET Framework 2.0 - 4.6
  • Windows 8
  • Windows Phone 8.1
  • Silverlight 4,5
  • .NET Framework 4.5.1上的DNX - 4.6
  • .NET Core 5.0上的DNX

现在这让我感到困惑。我总是这样说:我们针对.NET Framework进行编码,无论如何,框架都是框架。

但是在这里我们有这些平台,其中包括.NET框架,只是众多平台之一。我们有Windows 8,但是等一下,在Windows 8上运行.NET与在任何其他操作系统上运行.NET不同吗?为什么它与.NET Framework 2.0 - 4.6平台分开?

我们还将DNX作为特定平台。这让我感到奇怪:平台就是那个“支持东西”的平台。与启动虚拟机和提供操作系统接口有关?或者该平台包括虚拟机?

无论如何,可以看出我很困惑。那些平台到底是什么以及这与我目前对.NET Framework的理解有何关系?另外,为什么.NET Framework 2.0 - 4.6被描述为单独的?除非是.NET Core,否则这里描述的某些 某些版本的.NET Framework?

3 个答案:

答案 0 :(得分:7)

  

我们对框架进行编码。

嗯,确定你是。当您在代码中操作字符串时,您将始终使用System.String。并且它(几乎)总是表现出与完全相同的方法和属性完全相同的方式。

显示字符串确实有您无法忽略的实现细节:

  • 如果你想在Linux或OSX的Unix终端上展示它,那么你需要针对可以在这样的操作系统上运行的框架实现Mono或CoreCLR。
  • 如果你想在Windows商店应用程序(又名WinRT,又名Windows 8,又名UWP)中展示它,那么它实际上是一个引擎盖下的HSTRING,一个非常隐蔽的细节,你不必担心关于。但确实需要一个UI小工具,如Windows.UI.Xaml.Controls.TextBlock,一个高度特定于WinRT的类
  • 如果要在浏览器中显示它,则需要定位ASP.NET或Silverlight,优化为在Web服务器上运行的框架主机或作为浏览器的加载项。
  • 如果你想在一个由小型锂离子电池(如手机)供电的设备上展示它,那么你将不可避免地要处理一个优化的框架版本,以便像可能。 会影响你必须编写的代码,烧掉100瓦的代码与保持8小时电量不足的代码之间存在巨大差异。没有什么是你可以直接看到的,除了需要使用异步/等待很多,但肯定会非常严重地影响运行时。需要针对Xamarin或WinRT。
  • 如果要在任何操作系统上显示它,那么您需要定位一个框架版本,该版本不使用.NET在Windows上使用的那种技巧,以便EXE启动CLR虚拟机。这需要dnx.exe,就像你使用java.exe或python.exe来编写用Java或Python编写的程序一样。

如果这些实施细节无关紧要,那将是可爱的。但不是它在实践中的工作方式,因为.NET在越来越多的设备和操作系统上扩散并变得可用,它也不可避免地变得更加复杂。尽早选择目标,这很重要。

答案 1 :(得分:5)

有许多框架(.NET Framework,WinRT,UWP,Silverlight,.NET Core,Windows Phone,Mono,Micro Framework和旧的Compact Framework),而不仅仅是.NET Framework。

新方法是针对支持一个或多个此框架的平台标准进行编程。平台标准定义了一个与一个或多个框架匹配的API。这意味着如果您的应用程序支持平台标准1.1,您可能会支持几乎所有框架。 Platform standard 1.4仅支持.NET Framework 4.6.x和.NET Core

查看此文档:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md

答案 2 :(得分:5)

  

现在这让我感到困惑。我总是这样说:我们针对.NET Framework进行编码,无论如何,框架都是框架。

不,实际上有多个.NET框架或平台可供您调用。在.NET Standard之前,您曾经使用单个框架(可能是完整的框架,目前版本为4.6.3,如果您开发Web应用程序或Windows服务)。针对框架的DLL与另一个不兼容。 I.E.为完整的.NET框架开发的DLL无法在Windows Phone 8.1上执行。

这些框架实际上实现了一个非常小的通用库,但也有用于处理它们所针对的平台的特定库。 I.E.用于管理完整.NET框架中IIS上托管的Web服务器的库,或用于在Windows Phone 8.1框架中处理移动电话的函数。

.NET Standard之前是PCL

虽然有一种解决方法,称为PCL,它代表"便携式类库"。通过在两个或多个.NET框架中仅使用方法/程序集的小公共子集,可以开发一个可以包含在针对不同框架的项目中的库。例如,PCL配置文件37意味着您希望您的库可以在.NET Framework 4,Silverlight 5和Windows 8项目中使用。

请查看此列表以获取PCL配置文件及其兼容性列表(我不知道它是否详尽无遗):http://danrigby.com/2014/05/14/supported-pcl-profiles-xamarin-for-visual-studio-2/

那么.NET Standard呢?

.NET Standard的目标是简化这一过程并摆脱PCL。粗略地说,.NET Standard定义了一个契约(一组类和方法),它将由所有.NET框架实现。如果您开发一个面向.NET Standard的库,那么您确定它可以在所有.NET框架上运行。这是它背后的基本理念/目标(尽管它有点微妙)。

请查看具体兼容性:https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/#user-content-whats-new-in-net-standard-20

如果查看兼容性表,您将看到.NET Framework 4.6.3和.NET Core 1.0应用程序中可以使用面向.NET Standard 1.6的库(无需重新编译)。

换句话说,我们可以说 .NET Framework 4.6.3和.NET Core 1.0都实现了.NET Standard 1.6契约:它的类和方法。

如果您还希望您的DLL可以在Windows Phone 8.1项目中使用,那么您必须使用.NET Standard 1.2,它提供的功能少于.NET Standard 1.6(例如,没有System.Net.Sockets) )。

请参阅此处以获取每个.NET Standard https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md#user-content-list-of-net-corefx-apis-and-their-associated-net-platform-standard-version

版本中可用命名空间的列表