ASP.NET Core概述-微软已经收购了mono,为什么还搞.NET Core呢

一、.NET Core概述

1、相关历程

.NET在设计之初也是考虑像Java一样跨平台,.NET Framework是在Windows下运行的,大部分类是可以兼容移植到Linux下,但是没有人做这个工作。

2001年米格尔为Gnome寻找桌面开发技术,在研究了微软的.NET Framework之后发起了mono项目。

后来novell公司收购了mono,进一步完善了mono,并且把大部分.NET Framework功能移植到Linux下。mono也成为xamarin(使用.NET开发Android、iOS 移动应用技术)和unity3d(使用.NET 开发android,iOS游戏的技术)基础。

.NET Core是微软开发的另一个可以跨Linux、Windows、Mac等平台的.NET。

2016年初,微软收购mono的公司xamarin。那为什么微软已经收购了mono,还要搞出来一个.NET Core呢?因为mono完全兼容.NET Framework,架构太陈旧,不利于现在云计算、集群等新的架构理念。因此,微软推翻重写推出了.NET Core。

2、相关技术

.NET Core是.NET Framework的新一代版本,是微软开发的第一个具有跨平台(Windows、Mac OSX、Linux) 能力的应用程序开发框架。

.NET Core会包含.NET Framework的类库(部分命名空间改变、部分类库可能因为不适用已无对应),与.NET Framework不同的是,.NET Core采用包化(Packages)的管理方式,应用程序只需获取需要的组件即可。与.NET Framework大包式安装的做法截然不同,并且各个包有独立的版本线,不在硬性要求应用程序跟随主线版本。

.NET Core由许多项目所组成,除了基本的类库(Core FX)外,还包含了采用RyuJIT编译的运行平台 Core CLR、编译器平台.NET Compiler Platform、采用AOT编译技术运行最优化的包 Core RT(.NET Core Runtime),以及跨平台的MSIL编译器LLILC(LLVM-based MSIL Compiler)等项目。

RyuJIT: 微软发展的新式即时编译器(Just-in-Time Compiler),用来代替.NET Framework的JIT以及JIT64即时编译器。据微软测试报告数据,RyuJIT的性能较前一代JIT提升约25%,并支持SIMD(Single Instruction,Multiple Data)技术。RyuJIT已经应用于.NET Framework 4.6以及.NET Core中。

Core CLR:移植了.NET Framework的CLR功能,包含核心程序库mscorlib、JIT编译器、垃圾回收器(GC)以及其他运行MSIL所需的运行时环境。

Core RT:以AOT(Ahead-of-time)编译方式为主的核心功能,在.NET Core内成为Core RT,在UWP(Universal Windows Platform,通用应用平台)中称为.NET Native。

Core RT会在构建时期(非运行期间)在编译时将MSIL转换成平台本地的机器代码,其优点是引导时间短(JIT采用的是运行时编译,使得引导时间拉长),并且内存占用量少。Core RT在不同的平台会使用不同的AOT技术。

Windows下使用的是.NET Native。

Mac OSX和Linux上使用的是LLILC(同时支持JIT和AOT)。

LLILC:(LLVM-based MSIL Compiler,英文发音“lilac“)是.NET Core在非Windows平台的MSIL编译器,基于ECMA-335(Common Language Infrastructure)的标准将MSIL编译成本地码运行,适用于可运行LLVM的操作系统,例如Mac OSX和Linux操作系统。

Roslyn:.NET Compiler Platform(项目代码为Roslyn)是将.NET 平台的编译架构标准化的平台,它可提供程序管理工具(如集成开发环境)相当多的信息,用于发展有助于编写程序域管理程序机构所需要的功能,如类型信息、语法结构、语义、参考链接、自动化、编译器、错误回收等功能。

只要是遵循CLI标准的编程语言,都可以利用.NET Compiler Platform实现编译器,让程序管理工具能够实现如语法提示、语法自动完成、关键字高亮等可视化功能。

.NET Compiler Platform可同时支持.NET Framework 4.6以上版本,.NET Core也原生支持。

二、.NET Core安装和验证

1、下载安装

访问.NET Core下载页面,下载.NET Core 3.1版本

下载后直接双击安装一步一步安装即可。

2、验证

安装完成以后,我们打开命令提示符:

dotnet --version

查看当前.NET Core安装的最新版本。

dotnet --info

查看本机上.NET Core的相关信息。

三、.NET Core常用命令介绍

1、dotnet new

初始化创建一个有效的.NET Core项目和示例源代码

可以使用dotnet new -h来查看命令的帮助信息。

示例:

dotnet new mvc

2、dotnet restore

还原指定应用程序的依赖项和工具。

命令使用NuGet还原在project.json文件中被指定的依赖项,以及特定于项目的工具。默认情况下,依赖项和工具的还原是并行完成的。

对于依赖项,我们可以在还原操作时使用--packages 参数指定还原包的位置。如果没有指定,则默认使用NuGet包缓存,它可以在所有的操作系统上的用户目录下的.nuget/packages目录中找到。(Linux上的/home/user、Windows上使用%HOMEPATH%/.nuget/packages)

对于特定项目的工具,dotnet restore首先还原该工具的包,然后继续还原在project.json中指定的工具依赖项。

示例:

还原在当前目录中的项目依赖项和工具

dotnet restore

还原在给定的路径发现coreapp项目依赖项和工具

dotnet restore ~/projects/coreapp/project.json

还原在当前目录中的项目依赖项和工具,使用两个文件路径作为备用源

dotnet restore -f c:\packages\mypackages -f c:\packages\myotherpackages

还原在当前目录中的项目依赖项和工具,并在输出中仅显示errors

dotnet restore --verbosity Error

3、dotnet build

生成项目和所有的依赖。

该命令从源项目中的多个源文件及其依赖生成二进制文件。默认情况下,生成的二进制文件为中间语言(IL)并具有DLL扩展名。dotnet build还删除了\*.deps文件,该文件概述了主机运行应用程序所需的条件。

生成需要存在锁定文件,也就是说,在生成代码之前,必须先运行dotnet restore。

在任何编译开始之前,都应生成动词分析项目及其增量安全检查的依赖。如果所有的检查都能通过,就会继续生成与项目及其依赖的增量编译;否则,它将退回到非增量编译。通过配置文件标志,用户可以选择接受有关如何缩短生成时间的附加信息。

依赖项中需要编译的所有项目必须通过下面的安全检查,是编译过程为增量编译:

不使用预编译/编译后脚本。不从PATH加载编译工具(如Resgen、编译器)。仅使用已知编译器(csc、vbc、fsc)为了生成可执行的应用程序,而不是库,需要在project.json文件中进行特殊配置:

{

“compilerOptions”:{

"emitEntryPoint":true

}

}

示例:

编译当前目录的项目

dotnet build

编译当前项目并输出到c:\mydll

dotnet build --output c:\mydll

针对特定运行时生成项目及其依赖项

dotnet build --runtime ubuntu.16.04-x64

4、dotnet run

运行当前目录下的应用源代码。

此命令依赖于dotnet build,以便在启动程序前生成.NET程序集的源输入。输出的文件被写到bin文件夹,如果不存在则创建它,根据需要,文件将被覆盖。临时文件被写入到obj文件夹。

对于具有多个指定框架的项目情况下,dotnet run将首先选择.NET Core框架,如果不存在,则会输出错误。若要指定其他框架,需要使用--framework参数。

dotnet run命令必须在项目上下文中使用。如果你想执行一个dll,可以使用不带任何参数的dotnet命令 dotnet myapp.dll 直接运行生成后的dll。

示例:

运行当前目录中的项目

dotnet run

运行指定的项目

dotnet run --project /projects/coreapp/project.json

5、dotnet test

使用project.json中指定的测试执行工具执行单元测试。

该命令用于执行给定项目中的单元测试。单元测试是包含单元测试框架(包含NUnit或xUnit)和该单元测试框架的dotnet测试运行程序上的依赖项的类库项目。单元测试打包为NuGet包,并还原为该项目的普通依赖项。

测试项目需要在project.json中使用testRunner节点指定测试运行程序属性。此值应包含单元测试框架的名称。

dotnet test支持两种运行模式:

控制台,此模式下,dotnet test完全执行传递给它的任意命令,并输出结果。当只调用但不传递dotnet test时,在控制台模式下运行的端口将反过来使运行程序在控制台模式下运行。设计时,在其他工具,如编辑器或集成开发环境(IDE)的上下文中使用。示例:

运行当前目录所包含项目中的测试

dotnet test

运行test1项目中的测试

dotnet test /projects/test1/project.json

6、dotnet pack

使用代码创建NuGet包。

该命令生成项目并创建NuGet包,此操作将生成两个含有nupkg扩展名名的包:一个是包含代码,另一个包含调试符号。

被打包的项目的NuGet依赖项添加到nuspec文件,以便在安装包时可以将其解析。默认情况下,项目到项目的引用不会打包到项目内,要做到这一点,需要在依赖中将引用项目的type节点设置为build

{

"version":"1.0.0-*",

"dependencies":{

"ProjectA":{

"target":"project",

"type":"build"

}

}

}

dotnet pack 默认情况下,首先会生成项目,如果想避免这种情况,使用--no-build选项。这在持续集成(CI)生成方案中非常有用。

示例:

打包当前目录中的项目

dotnet pack

打包test1项目

dotnet pack ~/projects/test1/project.json

打包当前目录中的项目,并将生成的包放置到指定的nupkgs文件夹中

dotnet pack --output nupkgs

打包当前目录中的项目到指定的nupkgs文件夹中,并跳过生成步骤

dotnet pack --no-build --output nupkgs

打包当前项目,并更新生成的具有给定后缀的包版本,例如版本1.0.0-*将更新为1.0.0-ci-1234

dotnet pack --version-suffix "ci-1234"

7、dotnet publish

发布.NET 可移植或独立应用程序。

该命令用于打包应用程序及所有依赖到文件夹中,准备发布。

编译应用程序,读取在project.json文件中指定的依赖,并将生成的文件结果集发布到目录。

根据可移植应用的类型,生成的目录包含以下内容:

可移植应用程序,应用程序的中间语言(IL)代码和应用程序的所有托管依赖项。含本机依赖项的可移植应用程序:除上述内容外,还包括每个本机依赖项的受支持平台的子目录。独立应用程序,除上述内容外,还包括目标平台的完整运行时。示例:

使用在project.json中发现的框架发布一个应用程序,如果project.json包含runtimes节点,则发布当前平台的RID。

dotnet publish

使用指定的project.json发布应用程序

dotnet publish ~/projects/test1/project.json

使用netcoreapp1.0框架发布当前应用程序

dotnet publish --framework netcoreapp1.0

使用netcoreapp1.0框架和OS X 10.10运行时发布当前应用程序,这个RID必须存在于project.json的runtimes节点中

dotnet publish --framework netcoreapp1.0 --framework osx.10.11-x64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库版本管理框架-Flyway(从入门到精通)

一、flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等&am…

TCP对数据的拆分

应用程序的数据一般都比较大,因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度,数据会被以MSS长度为单位进行拆分,拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况,当判断…

JWT介绍及演示

JWT 介绍 cookie(放在浏览器) cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本…

JavaScript 金额元转化为万

function dealNum(price){if (price 0) {return 0元}const BASE 10000const decimal 0const SIZES ["", "万", "亿", "万亿"];let i undefined;let str "";if (price) {if ((price > 0 && price < BASE…

通过命令行输入参数控制激励

1)在命令行的仿真参数&#xff08;SIM_OPT&#xff09;加上&#xff1a;“var_a100 var_b99” 2)在环境中调用&#xff1a; $test$plusargs("var_a")&#xff1b;如果命令行存在这个字符&#xff0c;返回1&#xff0c;否则返回0&#xff1b; $value$plusargs(&qu…

蓝牙物联网对接技术难点有哪些?

#物联网# 蓝牙物联网对接技术难点主要包括以下几个方面&#xff1a; 1、设备兼容性&#xff1a;蓝牙技术有多种版本和规格&#xff0c;如蓝牙4.0、蓝牙5.0等&#xff0c;不同版本之间的兼容性可能存在问题。同时&#xff0c;不同厂商生产的蓝牙设备也可能存在兼容性问题。 2、…

0-1背包问题

二维版: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int N 1010;static int[][] dp new int[N][N]; //dp[i][j] 只选前i件物品,体积 < j的最优解static int[] w new int[N]; //存储价…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strcat的模拟实现 &#x1f680;前言 …

ReactJS和VueJS的简介以及它们之间的区别

本文主要介绍ReactJS和VueJS的简介以及它们之间的区别。 目录 ReactJS简介ReactJS的优缺点ReactJS的应用场景VueJS简介VueJS的优缺点VueJS的应用场景ReactJS和VueJS的区别 ReactJS简介 ReactJS是一个由Facebook开发的基于JavaScript的前端框架。它是一个用于构建用户界面的库&…

【C语言】——函数递归,用递归简化并实现复杂问题

文章目录 前言一、什么是递归二、递归的限制条件三、递归举例1.求n的阶乘2. 举例2&#xff1a;顺序打印一个整数的每一位 四、递归的优劣总结 前言 不多废话了&#xff0c;直接开始。 一、什么是递归 递归是学习C语言函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xf…

电商平台商品销量API接口,30天销量API接口接口超详细接入方案说明

电商平台商品销量API接口的作用主要是帮助开发者获取电商平台上的商品销量信息。通过这个接口&#xff0c;开发者可以在自己的应用或网站中实时获取商品的销量数据&#xff0c;以便进行销售分析、库存管理、市场预测等操作。 具体来说&#xff0c;电商平台商品销量API接口的使…

RocketMq集成SpringBoot(待完善)

环境 jdk1.8, springboot2.7.3 Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

Unity中后处理简介

文章目录 前言一、后处理的原理二、我们看一下Unity文档中&#xff0c;内置的后处理前后的效果后处理前&#xff1a;后处理后&#xff1a; 前言 我们在这篇文章中&#xff0c;了解一下Unity中的后处理效果 后期处理概述 一、后处理的原理 在后处理的过程中&#xff0c;我们主…

Java当中常用的算法

文章目录 算法二叉树左右变换数据二分法实现 冒泡排序算法插入排序算法快速排序算法希尔排序算法归并排序算法桶排序算法基数排序算法分治算法汉诺塔问题动态规划算法引子代码实现背包问题 KMP算法什么是KMP算法暴力匹配KMP算法实现 今天我们来看看常用的算法&#xff0c;开干。…

《微信小程序开发从入门到实战》学习四十五

4.4 云函数 云函数是开发者提前定义好的、保存在云端并且将在云端运行的JS函数。 开发者先定义好云函数&#xff0c;再使用微信开发工具将云函数上传到云空间&#xff0c;在云开发控制台中可看到已经上传的云函数。 云函数运行在云端Node.js环境中。 小程序端通过wx.cloud.…

IP地址定位技术为网络安全建设提供全新方案

随着互联网的普及和数字化进程的加速&#xff0c;网络安全问题日益引人关注。网络攻击、数据泄露、欺诈行为等安全威胁层出不穷&#xff0c;对个人隐私、企业机密和社会稳定构成严重威胁。在这样的背景下&#xff0c;IP地址定位技术应运而生&#xff0c;为网络安全建设提供了一…

短视频ai剪辑分发矩阵系统源码3年技术团队开发搭建打磨

如果您需要搭建这样的系统&#xff0c;建议您寻求专业的技术支持&#xff0c;以确保系统的稳定性和安全性。 在搭建短视频AI剪辑分发矩阵系统时&#xff0c;您需要考虑以下几个方面&#xff1a; 1. 技术实现&#xff1a;您需要选择适合您的需求和预算的技术栈&#xff0c;例如使…

肖sir__ 项目讲解__项目数据

项目时间&#xff1a; 情况一&#xff1a;项目时间开始到上线的时间&#xff0c;这个时间一般比较长&#xff08;一年&#xff0c;二年&#xff0c;三年&#xff09; 情况二&#xff1a;项目的版本的时间或则是周期&#xff08;1个月&#xff0c;2个月&#xff0c;3个月&…

机器人、智能小车常用的TT电机/310电机/370电机选型对比

在制作智能小车或小型玩具时&#xff0c;在电机选型上一些到各种模糊混淆的概念&#xff0c;以及各种错综复杂的电机参数&#xff0c;本文综合对比几种常用电机的参数及特性适应范围&#xff0c;以便快速选型&#xff0c;注意不同生产厂家的电机参数规则会有较大差异。 普通TT…

论文阅读:PointCLIP: Point Cloud Understanding by CLIP

CVPR2022 链接&#xff1a;https://arxiv.org/pdf/2112.02413.pdf 0、Abstract 最近&#xff0c;通过对比视觉语言预训练(CLIP)的零镜头学习和少镜头学习在2D视觉识别方面表现出了鼓舞人心的表现&#xff0c;即学习在开放词汇设置下将图像与相应的文本匹配。然而&#xff0c;…