.Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)

时间:2021-05-14 13:36:25

.Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是。事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求。但是它和.Net Framework的区别是什么?你需要知道什么才能有效的使用了它们。在这篇文章中,我们会解释主要的不同点和指导怎么确保最好的使用它们。

在以前,.Net Framework只能工作在Window设备上。Xamarin和Mono项目致力于将.Net移植到移动设备、MacOS和Linux。.Net Core提供了一套标准的基本库让其在windows、linux、macos、移动设备可以使用。

.Net 有下面四个部分组成:

  • Common language specification(CLS) :它定义了对象是如何实现的,因此它可以工作在任何地方,因为它跟系统平台无关。CLS是CTS(Common Type System)的子集,它设置了一种描述所以类型的通用方法。
  • Framework class library(FCL):是一个手机可重用类、接口和值类型的标准库。
  • Common language runtime(CLR):是运行框架并管理.Net程序执行的虚拟机。
  • 像VisualStudio这样的工具来创建独立的应用程序、交互式网站、Web应用程序和Web服务。

.Net Core vs .Net Framework

  微软维护的两个运行时,它们有许多相同的API。这个共享的API就是所谓的.Net Stand.

.Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)

开发者使用.Net framework去创建Window桌面应用和基础服务应用。它包含Asp.Net web应用程序。.Net Core被用于创建服务应用让它能运行在Windows、Linux和Mac上。它目前还不支持创建桌面应用。开发者可以在两个运行中用VB.Net 、C#和F#编写程序。C#是面向对象的语言。对于工作在C和其相似语言的人来说,学习曲线应该不是问题。F#是跨平台语言同时也是面向对象的语言。Visual Basic在.Net Framework中可用,在.Net Core2.0对其支持有限。

以下情况开发者应该选择.Net Core:

.Net Core是一个跨平台的和开源的框架,它可以在任何平台开发。通常它被使用在云应用程序或将大型企业应用程序重构为微服务。所以应该什么时候使用呢?

1、项目需要跨平台

当一个应用程序需要运行在多个平台像Windows、Linux和MacOS使用。这些操作系统已经被支持作为开发工作站(支持的操作系统正在增长)。

  • VS可以在Window上使用,并在macOS上使用新的受限版本。
  • VS Code可以使用在Window、Linux和macOS上。
  • 命令行被使用在所有被支持的平台上。

2、当使用Docker容器时

容器和微服务架构经常在一起使用。因为它是轻量级和模块化的,.Net Core很好的工作在容器中。服务器应用可以跨平台部署到Docker容器中。.Net Framework也可以使用容器,但是镜像太大了。

3、如果有很高的性能和可扩展系统需要

微软推荐用.Net Core和Asp.Net Core来获取最高的性能和拓展性。当成百个微服务被使用,这变的很重要。应该需要较少数量的服务器和虚拟机。所获取的效率和可扩展性可以转化为除了节约成本之外更好的用户体验。

4、如果你同时运行多个.Net 版本

要在.NET中以不同版本的框架安装依赖项的应用程序,开发人员需要使用.NET Core。 可以使用不同版本的.NET在同一台服务器上运行多个服务。

5、如果想用命令行开发

一些开发人员更喜欢用轻量级的编辑器和命令行来工作。.Net Core有命令行接口已经支持所有的平台。它要求最小的安装在生产机器上。

以下情况不适合使用.Net Core

有一个问题:.Net Core还没有全部支持.Net 的库和拓展。在某些情况下,它可能不是当前最好的选择,但是,随着持续发展,它最终可能适用于大多数用例。 考虑以下情况:

1、Windows Forms和WPF程序

是不被支持的。你不得不使用mont去制作适合macOS的.Net  桌面应用程序。

2、Asp.Net WebForms 不存在

微软有计划实现它在ASP.NET Core。

3、你需要创建WCF服务。

.Net Core现在还不支持WCF。取而代之,你需要使用ASP.NET Core MVC创建REST API。

4、第三方库的支持

.Net Core2.0提供了.Net Framework和.Net Core的兼容。但是仍然有类库没有被实现的兼容问题。尽管如此,这将有助于将许多类库连接到.Net Core。

5、缺少.Net Framework 特性

一些.Net Framework功能在.Net Core中没有。比如EF Core是不同EF v6的。

6、你需要访问特定的Windows API

如果你的程序需要访问注册表、WMI或者其他的Window API,它是不能工作的。.Net Core被设计跟系统无关。

7、部分支持VB.NET和F#

微软和社区再持续更新,但是还没有全部支持。

8、SingalR 没有被支持

它计划在.Net Core2.1中被支持.

以下情况,开发者应该使用.Net Framework

它可以与Docker和Window容器一起使用,并且使用它是可行的。

.Net Framework项目已经被使用。

代替迁移、替换应用程序。比如开发者可以写一个新的web service用Asp.Net Core。

.Net Framework项目中使用了第三方类库或者NuGet包,但在.Net Core中不可用。

.Net Core正在被广泛的使用,如果你工作在.Net Framework类库在.Net Core中没有被兼容,仍然需要使用.Net Framework。NuGet是.NET和其他Microsoft开发平台的免费和开源软件包管理器。

开发的项目中在.Net Core中还不可用

  • .Net Core还没有全部支持.Net Framework的技术。这些包含:
  • Asp.Net Web Forms应用程序
  • Asp.Net Web Pages应用程序
  • Asp.Net SignalR 服务端/客户端
  • WCF服务
  • 与工作流相关的服务
  • WPF和Windows Form

一些平台还没有支持.Net Core

什么时候不用.Net Framework

下面这些情况不应该使用.Net Framework:

  • 项目需要在多个平台使用。
  • 需要高的性能和拓展性。
  • 项目必须使用开源框架

怎样从.Net Framework移植到.Net Core上

1、分析第三方依赖

这设计到的不仅仅是知道第三方依赖关系是什么。如果要用程序运行在.Net Core上,应该如何依赖那些第三方依赖福关系,以及如果他们不运行,需要知道该应用程序需要做什么。

NuGet软件包很容易检查,因为它通常在NuGet的网站上有描述依赖,并且软件包为每个平台都有一组文件夹。 您还可以查看该包的页面上的依赖关系,然后查找具有以下任一名称的文件夹或条目。

如果依赖关系不是NuGet包,则ApiPort工具可以检查依赖关系的可移植性。

与.NET Core 2.0一起使用的新功能,兼容性可以引用尚未转换为使用.NET Standard的.NET Framework软件包。 请确保彻底测试这些软件包,因为如果他们使用不受支持的API,它们可能仍然存在问题。

2、标准库的目标

.NET标准库旨在用于所有.NET运行时,因此定位.NET标准库是构建跨平台类库的最佳方式。

有八个平台可以在不同程度上提供多个版本。 如果项目的目标版本较低,则无法引用以较高版本为目标的项目。 选择所有项目中使用的最低.NET标准版本。 下面是每个.NET标准版本的图表,显示了它们运行的特定区域:

.Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)

3、重新调整项目

所有要移植的项目都需要针对.NET Framework 4.6.2。 这将确保用于.NET Framework特定目标的API替代品可用于不受支持的API。这可以在Visual Studio中用“Target Framework”命令轻松完成并重新编译这些项目。

文章翻译来源为.NET Core vs .NET Framework: How to Pick a .NET Runtime for an Application

.Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)的更多相关文章

  1. .Net Core vs .Net Framework 如何为一个应用程序选择一个运行时

    .Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是.事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求.但是它和.Net Framework的区别是什么?你 ...

  2. 用代码如何检测一个android程序是否在运行

    /** * 检测一个android程序是否在运行 * @param context * @param PackageName * @return */ public static boolean is ...

  3. 教你如何检查一个函数是否为JavaScript运行时环境内建函数

    在开发过程中,对于某些API在现有的JavaScript运行时环境不支持的时候,我们大都会采用加入polyfill来解决这个问题.但有些时候我们可能需要知道现在某个API到底是否为运行时环境所原生支持 ...

  4. 一个“Hello World”理解JVM运行时数据区

    先上一张JVM体系结构图: 1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行.在执行引擎执行的过程中产生的数据会存储在一块 ...

  5. Ubuntu下第一个C程序的成功运行

    对于每个新手来说,进入Ubuntu最想做的事莫过于在终端(Terminal)里运行自己的第一个C/C++程序"hello.c/hello.cpp"了. 很多语言书籍都是默认搭载好运 ...

  6. Ubuntu下编译第一个C程序的成功运行

    1. 打开控制台:使用快捷键 Ctrl + Alt + T: 2.  安装gcc为C语言编译器,g++为C++ 语言编译器 sudo apt-get install g++. 3.  编辑好hello ...

  7. 手动创建第一个OC程序

    手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...

  8. JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令

    通过 java.lang.Runtime 类可以方便的调用操作系统命令,或者一个可执行程序,下面的小例子我在windows和linux分别测试过,都通过.基本原理是,首先通过 Runtime.getR ...

  9. 怎样从一个DLL中导出一个C&plus;&plus;类

    原文作者:Alex Blekhman    翻译:朱金灿 原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译 ...

随机推荐

  1. 文本编辑器的使用(ckeditor&sol;ueditor)

    1.下载ckeditor或ueditor 2.编写示例代码 注意:使用ueditor时,需要特殊配置图片路径(图片的配置路径在ueditor/php/config.json文件中) 3.结果 (需要源 ...

  2. struts2类型转换器、 类型转换错误 以及INPUT view

    1.1.1    Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...

  3. FME之于规划CAD数据质量检测

    最近琢磨规划CAD数据转换入库GIS方面的技术问题,看过一些前辈的文章/文献,对于使用FME WorkBench方面,有了一些了解,往往直接转换数据丢失比较严重,而且GIS对图形属性和空间拓扑比较严格 ...

  4. BZOJ3246 &lbrack;Ioi2013&rsqb;Dreaming

    Description Serpent(水 蛇)生活的地方有N个水坑,编号为0,...,N - 1,有M条双向小路连接这些水坑.每两个水坑之间至多有一条路径(路径包含一条或多条小路)相互连接,有些水坑 ...

  5. 观察者模式:关于通知的使用(NSNotificationCenter)

    一.通知的使用方法 1.发出通知 例如:[[NSNotificationCenter defaultCenter]postNotificationName:@"backToFirstPage ...

  6. Django 学习笔记之五 Django中数据库中ManyToManyField及ForeignKey

    1.model里面的代码: from __future__ import unicode_literalsimport django.utils.timezone as timezonefrom dj ...

  7. ubuntu server 安装

    http://tigerlchen.iteye.com/blog/1765765  解决CDROM找不到的bug

  8. SVN导出增量包的方法

    此方法是在svn1.7版本基础上进行的操作,其他版本没有验证 第一步.点击右键,选择“TortoiseSVN–> Show log”. 进入日志页面,如下图所示: 第二步.选择版本区间,右键选择 ...

  9. SD卡读写扇区注意事项(转)

    源:http://blog.163.com/zhaojun_xf/blog/static/30050580201151410635516/ 在调试SD卡时,大家都喜欢使用扇区进行验证.也就是说,一般都 ...

  10. Java中的instanceof和isInstance基础讲解

    1. instanceof 是一个操作符 使用方法: ? 1 2 if(a instanceof B){ } 表示:a 是不是 B 这种类型 2. isInstance是Class类的一个方法 ? 1 ...