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

use*_*696 27 .net c# windows .net-core dnx

目前正在尝试了解.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的某些版本?

Han*_*ant 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在越来越多的设备和操作系统上扩散并变得可用,它也不可避免地变得更加复杂.尽早选择目标,这很重要.


Jue*_*sch 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


Pie*_*sso 5

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

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

这些框架实际上实现了一个非常小的通用库,但也有用于处理它们所针对的平台的特定库.用于管理在完整.NET框架中的IIS上托管的Web服务器的IE库,或用于在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-视觉工作室-2 /

那么.NET标准呢?

.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的API,和其相关的净平台标准版