目前正在尝试了解 .NET 平台标准,我发现自己对“不同平台”的概念感到很困惑。
我会尽力阐明我的观点。我目前关于 .NET Framework 的看法是,.NET 大致上由 CLR、BCL 和支持软件组成,用于启动 CLR 并提供虚拟机和底层操作系统之间的接口(interface)。
因此,当我们使用 .NET Framework 进行编码时,我们确实以某个版本的框架为目标,因为我们从 BCL 使用的类型随框架一起提供,因此取决于特定版本。
现在,.NET Core 与我所理解的完全不同。并不是所有的东西都像那样挤在一起。我们有 CoreCLR,它是一个运行 IL 的轻量级 VM,CoreFX 是正确组织为 NuGet 包的库,到目前为止,我们有 DNX/DNVM/DNU,它提供支持的东西,比如启动 CoreCLR 和与操作系统。
无论如何,尽管我们在 Windows 7、Windows 8 或 Windows 10 上安装框架,我们还是针对框架进行编码。
现在,在 .NET 平台标准规范中,我们看到以下定义:
Platform - e.g. .NET Framework 4.5, .NET Framework 4.6, Windows Phone 8.1, MonoTouch, UWP, etc.
之后我们还会看到一个平台列表,其中包括
- .NET Framework 2.0 - 4.6
- Windows 8
- Windows 手机 8.1
- 银光 4、5
- .NET Framework 4.5.1 - 4.6 上的 DNX
- .NET Core 5.0 上的 DNX
现在这让我很困惑。我一直认为:我们针对 .NET Framework 进行编码,无论如何,框架就是框架。
但这里我们有这些平台,其中包括 .NET 框架,只是众多平台中的一个。例如,我们有 Windows 8,但等一下,在 Windows 8 上运行 .NET 与在任何其他操作系统上运行 .NET 不只是一回事吗?为什么它独立于 .NET Framework 2.0 - 4.6 平台?
我们也有 DNX 作为特定平台。这让我想知道:平台是与引导虚拟机和提供操作系统接口(interface)相关的“支持性东西”吗?或者平台包括虚拟机?
无论如何,可以看出我很困惑。这些平台到底是什么?这与我目前对 .NET Framework 的理解有什么关系?另外,为什么要单独描述 .NET Framework 2.0 - 4.6?除了 .NET Core 之外,这里描述的一切不是某个版本的 .NET Framework 吗?
最佳答案
we code against the framework.
好吧,你当然是。当您在代码中操作字符串时,您将始终使用 System.String。它(几乎)总是以完全相同的方式和完全相同的方法和属性表现。
但是显示字符串确实有您不能真正忽略的实现细节:
- 如果您想在 Linux 或 OSX 上的 Unix 终端中显示它,则需要以 Mono 或 CoreCLR 为目标,这些框架实现可以在此类操作系统上运行。
- 如果您想在 Windows 应用商店应用程序(也称为 WinRT、Windows 8、UWP)中显示它,那么它实际上是引擎盖下的 HSTRING,这是一个隐藏得很好的细节,您不必担心。但确实需要一个 UI 小工具,例如 Windows.UI.Xaml.Controls.TextBlock,这是一个高度特定于 WinRT 的类
- 如果您想在浏览器中显示它,那么您需要以 ASP.NET 或 Silverlight 为目标,框架主机经过优化以在网络服务器上运行或作为浏览器的加载项。
- 如果您想在由小型锂 ionic 电池供电的设备(例如手机)上展示它,那么您将不可避免地需要处理经过优化以尽可能少使用电量的框架版本。这确实会影响您必须编写的代码,消耗 100 瓦的代码与使微型电池保持 8 小时运行的代码之间存在巨大差异。除了需要大量使用 async/await 之外,您无法直接看到任何东西,但肯定会严重影响运行时。需要以 Xamarin 或 WinRT 为目标。
- 如果您想在任何操作系统上显示它,那么您确实需要定位一个框架版本,该版本不使用 .NET 在 Windows 上使用的那种让 EXE 启动 CLR 的技巧虚拟机。这需要 dnx.exe,就像您对用 Java 或 Python 编写的程序使用 java.exe 或 python.exe 一样。
如果这些实现细节无关紧要,那就太好了。但它在实践中的工作方式并非如此,随着 .NET 的激增并在越来越多的设备和操作系统上可用,它也不可避免地变得更加复杂。尽早选择您的预期目标,这很重要。
关于c# - .NET 平台标准中有哪些平台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421935/