.NET平台系列12 .NET未来之开源.NET Core
微软于2014年11月推出了.NET Core 1.0。.NET Core的目标是从我们在过去12年中对.NET Framework的构建、交付和服务的经验中吸取教训,并开发出的更好的产品。这些改进的一些例子包括并行安装(可以安装新版本,而不必担心破坏现有应用程序)、自包含应用程序(应用程序可以嵌入.NET,因此.NET不需要在计算机上安装),而不是Windows操作系统的一个组件(.NET发布独立于操作系统时间表的新版本)等等。在此基础上,我们使.NET Core开源和跨平台。
.NET Core 1.0主要关注高性能Web和微服务。NETCore2.0增加了2000多个API和组件,如Razor页面和SignalR,使Web应用程序更容易移植到.NETCore。现在.NETCore3.0通过添加WinForms、WPF和EntityFramework6来支持桌面应用程序,这使得将桌面应用程序移植到.NETCore成为可能。
在.NET Core 3.0之后,我们将不再从.NETFramework移植更多功能。如果您是一名Web Form开发人员,并且希望在.NET Core上构建一个新的应用程序,我们建议您使用Blazor,它提供了最接近的编程模型。如果您是远程处理或WCF服务器开发人员,并且希望在.NET Core上构建新的应用程序,我们建议您选择ASP.NET Core Web API或gRPC,后者提供跨平台和跨编程语言(基于契约的gRPC)的能力。如果您是Windows工作流开发人员,则有一个.NET Core的开源工作流项目。
随着.NET Core 3.0于2019年9月发布,我们认为所有新的.NET应用程序都应该基于.NET Core。.NET Framework 中支持的主要应用程序类型在.NET Core 中任然受到支持。如果某些组件没有被移植过来,则建议使用新的技术替代(如:gRPC代替WCF、Workflow-Core 与 elsa.NET 代替 WorkFlow)。在.NET中的所有未来投资都将在.NET核心中进行。这包括:运行时、JIT、AOT、GC、BCL(基类库)、C#、VB.NET、F#、ASP.NET、实体框架、ML.NET、WinForms、WPF和Xamarin。
.NET Framework 4.8 将是.NET Framework的最后一个主要版本。如果您有您正在维护的现有.NET Framework应用程序,则无需将这些应用程序移动到.NET Core。我们将继续服务和支持.NET框架,其中包括bug、可靠性和安全修复。它将继续随Windows一起发布(大部分Windows依赖.NET Framework),我们将继续改进Visual Studio中对.NET的工具支持(Visual Studio是在.NET Framework上编写的)。
新的应用程序应该建立在.NET Core上。.NETCore是.NET未来投资的地方。现有的应用程序可以安全地保留在.NET Framework上,这将得到支持。想要利用.NET新功能的现有应用程序应该考虑迁移到.NET核心。随着我们对未来的规划,我们将为平台带来更多的功能。
.NET Core是一个模块化的开发堆栈,是将来所有.NET平台的基础。ASP.NET5和.NET Native已经使用了它。下图展示了NET Core以及它与NET Framework的关系。
开源.NET Core的主要原因有两个:
- 为跨平台.NET奠定基础
- 作为.NET开发人员,现在可以在一段时间内不仅在Windows上构建和运行代码,还包括Linux,MacOS,iOs和Android。挑战在于Windows实现具有一个代码库,而Mono具有完全独立的代码库。Mono社区实际上被迫重新实现.NET,因为没有可用的开源实现。当然,自Rotor起就可以使用源代码,但是我们没有使用OSI批准的开放源代码许可证,这使得Rotor成为一个非启动程序。客户报告了各种不匹配的情况,很难修复,因为任何一方都不能查看另一方的代码。这也会导致在实际上并不特定于平台的领域中出现大量重复工作。最近的一个例子是不可变集合。
- 构建跨平台堆栈的最佳方法是以协作的方式构建单个堆栈。做到这一点的最佳方法是将其开源。
- 建立并利用更强大的生态系统
- 微软团队通过NuGet追求了一个更加敏捷的开发周期,至今已有近两年时间。我们已经看到在早期发布并经常发布以使客户提供反馈方面取得了巨大的成功。
2018年6月微软以75亿美元收购 GitHub。之后.NET团队决定在GitHub上托管.NET Core。原则上,我们不想让社区来到我们这里。相反,我们想去社区已经存在的地方。根据许多其他项目收到的反馈,似乎.NET社区中的大多数人都在GitHub上。
难以置信,我也很怀疑,所以我做了一个小实验。我把我的一个个人开源项目从CodePlex搬到了GitHub。在CodePlex的两年里,我只收到一个pull请求。在我搬到GitHub的五天后,我已经收到了三个pull请求,并找到了另外两个贡献者。这是三个月前的事了。从那以后,我总共收到了16个pull请求,其中许多请求都有大量的特性工作(顺便说一下:第一个是关于增加单元测试的,这有多棒?)。虽然这显然不是一个具有代表性的样本大小,但它确实非常符合我们从客户那里听到的。
所以为了达到社区的目的,我们决定在GitHub上托管.NET Core。一个月前,我们已经在GitHub上提供了示例。
我的团队以前做过开源,例如MEF,但我认为公平地说,这并不是很有成效。我们认为主要原因是缺乏社区参与。虽然我们提供了源代码,但我们还没有投资建立一个围绕它的社区。我们坚信建立一个社区是任何开源项目成功的关键。为了建立一个社区,发展必须在开放的环境中进行。
为了达到期望,我们还希望在公开计划开发方式,必须克服的挑战以及尚未完全解决的领域方面保持透明。因此,让我解释一下。
第一步是我们将停止做代码炸弹,这是我们以前用MEF做的。代码炸弹本质上是团队实际工作的内部系统对公共源代码的半定期更新。这个问题有几个原因。一方面,时间延迟使公开讨论变得困难,因为并非所有各方都看到同一个来源。另一个大问题是,内部历史刚刚丢失。自动同步在某种程度上是有帮助的,但感觉就像是重新发明了Git。因此,我们没有使用代码炸弹,而是设置了开发环境,使公共GitHub存储库成为主导系统。这意味着所有代码更改都将立即生效。但我们不会就此止步:
- 代码审查。我们还希望通过GitHub的pull request模型让团队也在公开场合进行所有代码审查。
- 设计论文和讨论。我们还将共享设计说明,规范和特定于实现的文档。我们需要弄清楚我们将使用哪种格式。至少您可以期待基于Markdown的文档,类似于Mad的C#设计说明。我们的另一个想法是记录我们的设计会议并在Channel 9上分享。我们需要弄清楚如何才能以一定的节奏进行此操作。
我们计划主要使用GitHub问题来跟踪错误。棘手的是,我们还有其他的来源,特别是用户语音、连接和内部TFS。我们对这项工作的看法如下:
- 用户语音。由于出色的投票系统,User Voice非常适合优先考虑可能相当昂贵的工作项目的投资。因此,对于更大的功能和根本的创新,用户语音是最佳选择。
- 连接。Connect主要供企业客户和产品支持使用。我们很可能会继续在该通道中使用它,但是在为.NET Core提交错误时,我们不建议您这样做。
- 内部TFS。虽然我们不再将TF版本控制用于.NET Core,但大块的DevDiv仍然可以使用。为了进行跨小组的协作,我们可能会继续允许团队在TFS中向我们提交错误。我们正在努力弄清楚如何将这些错误公开。一种选择是创建一个自动镜像系统。
我们接受贡献!但正如任何开源项目一样,我们并不是盲目地接受一切。我们收到的拉取请求将根据以下标准进行判断:
- 线路图。所有项目都将精力集中在某些领域。为了保持焦点和动力,将大部分工作与产品路线图保持一致很重要。
- 质量。我们有责任提供高质量的代码。因此,外部人员必须满足Microsoft员工必须满足的相同质量要求。这包括具有正确的设计,体系结构,足够的测试范围以及遵循编码风格。
我们相信,通过公开进行开发,我们可以为外部开发人员提供足够的成功环境。例如,您将能够查看我们的代码审查并阅读有关内部设计方式的文档。我们还将发布路线图。通常情况下,最好通过提前告诉我们您想贡献什么来避免过晚的意外。例如,我们可以通过向您提供指向文档的指针或讨论您的方法来提供帮助。我们还想到了将GitHub问题标记为待办事项,以便在宣传中表明我们希望您在特定工作项上提供帮助。
通常,所有贡献都将使用GitHub的pull request模型完成。也就是说,您将分叉我们的项目,在主题分支中执行工作,然后针对我们的master分支提交拉取请求。这与我们用于代码审查的模型相同。
在我们将您的工作整合到项目中之前,您需要签署贡献者许可协议(CLA)。我们目前正在使用该工具,但它看起来可能类似于Azure CLA流程。
为了发挥我们的作用或尝试自己的修改,您需要能够构建和运行自己的库版本。我们希望使它像馅饼一样容易,所以这里是:
- 您克隆了我们的仓库()
git clone https://github.com/dotnet/corefx
- 您调用
build.cmd
该构建仅需要Visual Studio 2013(即不需要“ Dev14”)。它将构建所有库并运行单元测试。
过去我们面临的挑战之一是强大的命名,这使您无法将二进制文件简单地放入现有项目中。我们通过提供一种强名称二进制文件的新方法解决了这一问题,我们称其为开放源代码签名。您可以在我们的开发人员指南中找到更多信息。
.NET Core项目由.NET Foundation负责。我们认为,这将是促进和推进.NET Core堆栈的关键部分。我们正在与Xamarin / Mono的Miguel de Icaza紧密合作,以创建可以成为.NET Core跨平台实现的共享代码库。
如今,GitHub上只有一部分库可用:
以下是我们正在努力的领域:
更多的类库。
在非Windows平台上构建和运行。
.NET Core运行时(CoreCLR)。
参考文献:
- 《.NET Core is the Future of .NET 》https://devblogs.microsoft.com/dotnet/net-core-is-the-future-of-net/
- 《.NET Core is Open Source》https://devblogs.microsoft.com/dotnet/net-core-is-open-source/
.NET平台系列12 .NET未来之开源.NET Core的更多相关文章
- .NET6 平台系列4 .NET开源之路
系列目录 [已更新最新开发文章,点击查看详细] .NET平台是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大的技术栈,涉及多语言(支持C#.F#.VB.NET ...
- Caffe学习系列(12):训练和测试自己的图片--linux平台
Caffe学习系列(12):训练和测试自己的图片 学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ...
- .NET平台系列5 .NET Core 简介
系列目录 [已更新最新开发文章,点击查看详细] 自1995年互联网战略日以来最雄心勃勃的事业 -- 微软.NET战略, 2000年6月30日. 微软公司于2002年2月13日正式推出第一代.N ...
- APU平台DirectX 12性能测试:超级大惊喜!
APU平台DirectX 12性能测试:超级大惊喜! 转自:http://www.ithome.com/html/digi/129840.htm [size=1pc]微软将会在接下来的GDC 2015 ...
- .NET 平台系列6 .NET Core 发展历程
系列目录 [已更新最新开发文章,点击查看详细] 在我的上一篇博客<.NET平台系列5 .NET Core 简介>中主要介绍了.NETCore的基本情况,主要包括.NET跨平台的缘由 ...
- .NET平台系列22:.NET Core/.NET5/.NET6 对比 .NET Framework
系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<.NET平台系列2 .NET Framework 框架详解>与 <.NET平台系列7 .NET Core 体系结构 ...
- 我发起了一个 .Net 平台上的 产生式编程 开源项目 GP.Net
大家好 , 我发起了一个 .Net 平台上的 产生式编程 开源项目 GP.Net . 我们可以先看看一个网友的 代码生成器 项目 : <.Net 代码生成器 for PostgreSql> ...
- .NET平台系列目录
本系列主要讲解微软.NET平台发展历程以及.NET框架技术.包含.NET Framework..NET Core.Xamarin..NET Standrad等技术与应用. 1..NET平台系列 .NE ...
- Java 集合系列 12 TreeMap
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
随机推荐
- Ambassador-09-prefix正则表达式
设置 prefix_regex: true,即prefix就可以设置成正则表达式 --- apiVersion: getambassador.io/v2 kind: Mapping metadata: ...
- 简单的了解下Java设计模式:迭代器模式(转载)
迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. Java 开发过程中遍历是常用的.如下边程序: for(int i =0 ; ...
- 2.7w字!Java基础面试题/知识点总结!(2021 最新版)
这篇<Java 基础知识总结>是 JavaGuide 上阅读量最高的一篇文章,由于我对其进行了重构完善并且修复了很多小问题,所以,在博客园再同步一下! 文章内容比较多,目录如下: 基础概念 ...
- k8s kubernetes给node节点添加标签和删除node节点标签
node节点IP 192.168.1.205 给节点添加标签的命令 添加label语法 kubectl label nodes <node-name> <label-key>= ...
- 🍎
江湖中有一本练了就能天下无敌的葵花宝典,大家都想得到它.如果有一天葵花宝典被公开了,人人都有机会练,到底是好事还是坏事呢? 这会成为一个灾难. 因为一个人拥有时,练不练是一个人的事.大家都拥有,练不练 ...
- 06- 移动端APP兼容性测试以及APP兼容性测试手机选择与云测试技术
在开始测试APP之前,应该考虑什么问题?或者如何选择设备?多少部手机测试兼容性最佳? 兼容性测试手机数量:主测手机 1 ,2(根据人员),辅助测试手机:用于兼容性测试.(50-60台最佳,至少5-20 ...
- ubuntu 1804 配置阿里源
以防出错,先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑元列表文件sudo vim /etc/apt/sources.list ...
- xposed学习四:总结
xposed的学习要告一段落,接下来去学习android apk和so加固,这里我们回顾下xposed吧. xposed是个hook框架,它是基于dalvik(确切来说是目前的版本,作者说ART也快出 ...
- POJ1094查分约束,判断关系是否唯一
题意: 给你一些a<b的关系,然后有三组询问. 1 当前这组之后如果能确定这n个数的大小关系,那么就输出关系 2 当前时候出现bug,就是和前面如果冲突,那么就不行 3 最后的答案是 ...
- Java中常见的包
目录 JDK自带的包 第三方包 JDK自带的包 JAVA提供了强大的应用程序接口,既JAVA类库.他包含大量已经设计好的工具类,帮助程序员进行字符串处理.绘图.数学计算和网络应用等方面的工作.下面简单 ...