目前正在尝试了解.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进行编码,无论如何,框架都是框架。
但是在这里我们有这些平台,其中包括.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?
答案 0 :(得分:7)
我们对框架进行编码。
嗯,确定你是。当您在代码中操作字符串时,您将始终使用System.String。并且它(几乎)总是表现出与完全相同的方法和属性完全相同的方式。
但显示字符串确实有您无法忽略的实现细节:
如果这些实施细节无关紧要,那将是可爱的。但不是它在实践中的工作方式,因为.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框架上运行。这是它背后的基本理念/目标(尽管它有点微妙)。
如果查看兼容性表,您将看到.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
版本中可用命名空间的列表