微软跨平台之.NET Core

知道91 | .Net | 2015-11-29 | 阅读:4672

微软在connect()大会上宣布.NET Core将开源。它将提供一个支持包括Windows、Linux和Mac OSX在内的所有平台的单一代码库。

第一次让我们回头来了解.NET 平台如何打包在过去。这有助于激励的一些决定和结果创建了.NET 核心的想法。

.NET 核心

dotnet

NET 核心是可以用在各种各样的垂直缩放从触摸基于的设备的数据中心的模块化实现是可用作为开放源码和支持由微软 Windows、 Linux 和 Mac OSX 上。

让我走进的如何.NET 核心看起来像,它是如何解决问题我前面讨论的更多细节。

.NET 本机和 ASP.NET 的统一

当我们设计.NET 本机很显然我们不能使用.NET 框架为基础的框架类库。这是因为.NET 本机基本上合并与应用程序框架,然后再移除碎片,不需要由应用程序之前它生成的本机代码 (我大大简化这一过程在这里。有关更多详细信息,看看这深潜)。正如我刚才所说,.NET 框架执行不考虑使得它极具挑战性,链接器以减少多少框架获取编译成应用程序 — — 依赖封闭是太大。

ASP.NET 是 5 面临类似的挑战。尽管它不使用.NET 本机新的 ASP.NET 5 web 堆栈的目标之一是提供 XCOPY 部署堆栈,使 web 开发人员没有与他们的 IT 部门协调,以便能依赖更高版本。在这种情况下它也是重要的是尽量减少框架的大小,因为它需要与应用程序一起部署。

.NET 核心是本质上叉 NET 框架的执行也优化周围保理业务的关注。尽管.NET 本机 (基于触摸设备) 和 ASP.NET 5 (服务器端 web 开发) 的情况是完全不同,我们都能提供统一基类库 (BCL)。

dounet

为.NET 核心 BCL API 表面积是相同自这两个.NET 本机以及 ASP.NET 5。底部的 BCL 我们有特定于.NET 运行时非常薄层。我们目前有两种实现方式: 一是特定于本机.NET 运行时和一种特定于 CoreCLR,使用 ASP.NET 5。然而,该图层不经常改变。它包含类型,如字符串和 Int32。BCL 绝大多数是纯 MSIL 程序集可以作为共享-是。换句话说,Api 不只是看起来相同 — — 它们共享相同的实现。例如,就没有理由要集合的不同实现。

BCL,此外还有应用程序模型特定 Api。例如,.NET 本机方面提供特定于 Windows 客户端开发,如 WinRT 互操作的 Api。ASP.NET 是 5 添加如 MVC 是特定于服务器端 web 开发的 Api。

我们认为.NET 核心不是特定于.NET 本机的也 ASP.NET 5 — — BCL 和运行时环境是一般用途为模块化设计。因此,它的基础为所有未来的.NET 纵向市场。

NuGet 微软的图书馆

与.NET 框架,将作为一组 NuGet 包交付.NET 核心平台。我们已经落在 NuGet因为这是绝大多数图书馆生态系统已经在哪里。

为了继续我们的模块化和构造良好的努力我们不只是作为一个单一的 NuGet 包提供整个.NET 核心平台。相反,它是一套的细粒度 NuGet 程序包:

微软

BCL 层,我们将有 1 对 1 关系之间的程序集和 NuGet 程序包。

向前,NuGet 包将具有相同的名称的程序集。例如,不可变集合不再会在一个叫做Microsoft.Bcl.Immutable的 NuGet 包传送但相反被称为System.Collections.Immutable的包中.

此外,我们已经决定为我们的程序集版本控制使用语义版本控制。NuGet 软件包的版本号将程序集版本与对齐。

命名和版本控制的程序集和包之间的对齐方式极大地帮助与发现。不再是神秘的 NuGet 程序包包含 System.Foo,版本 = 1.2.3.0 — — 它由 System.Foo 包 1.2.3 版本中提供。

NuGet 允许我们以敏捷的方式交付.NET 核心。所以如果我们提供升级到任何 NuGet 程序包,您可以简单地升级相应的 NuGet 参考。

提供框架本身对 NuGet 还会移除表示 1 方.NET 依赖项之间的差异和第三方依赖关系 — — 它们是所有 NuGet 依赖项。这使第三方包来表达,例如,他们需要较高版本的 System.Collections 图书馆。安装此第三方包现在可以提示您升级您对 System.Collections 的引用。你不需要了解的依赖关系图 — — 你只需要同意对它进行更改。

NuGet 基于交货也变成一个本地应用程序框架的.NET 核心平台。.NET 核心的模块化设计保证了每个应用程序只需要部署它的需要。我们也正在启用智能共享,如果多个应用程序使用相同的框架位。然而,目标是确保每个应用程序逻辑上有它自己的框架,以便升级不会干扰其他应用程序在同一台机器上运行。

我们决定使用 NuGet 作为一种传递机制不会改变我们对兼容性的承诺。我们继续极其认真的兼容性并不会一旦包标记为稳定执行 API 或行为的重大更改。然而,应用程序本地部署确保在哪里是变化视为添加剂中断应用程序的情况很少是孤立发展时间只。换句话说,为.NET 核心这些工间休息只能发生在你升级包的引用后。在那一刻,你有两个选项: 解决在应用程序中的故障,兼容或回滚到以前的版本的 NuGet 包。但.NET 框架与那些断裂不会发生后你部署到客户或生产服务器应用程序。

Windows 应用商店与 Windows Phone

Windows 商店 8.1 和 Windows Phone 8.1 平台有很多较小的.NET 框架子集。然而,他们也是.NET 核心的子集。这使我们能够使用.NET 核心作为两个向前这些平台的底层实现。所以如果你正在为这些平台将能够直接消耗所有的创新,而无需等待更新的框架。

这也意味着 BCL Api 在这两个平台上可用的数量将与那些你可以看到在 ASP.NET 5 今天完全相同。例如,这包括非泛型集合。这将使它更便于你带到触摸基于应用程序体验在.NET 框架上运行的现有代码。

另一个明显的副作用是 Windows 应用商店和 Windows Phone 中的 BCL Api 完全收敛和底层的.NET 平台现在是两个由.NET 核心供电将继续融合。

总结

如果您还不基于.NET 核心的至少一个平台,你被受到可以共享它的 Api。在此模式下,你仍然能够升级 NuGet 程序包,但可能会提示您选择更高的平台版本或完全放弃对他们的支持。