ASP.NET Core全面扫盲贴
1. 前言
.net发行至今已经过了十四个年头。随着版本的不断迭代更新,.net在windows平台上的表现也是越来越好,可以说windows平台上所有的应用类型.net几乎都能完成。
只是成也windows,败也windows,这十四年来,除了部分“民间”版本,.net一直没能在官方支持下摆脱windows平台的局限,“开源”和“跨平台”这两个词语也是所有.net开发者心中的痛楚。最终,.net core出现了,它让开发者们在官方和社区的支持走出了windows,可以在macos,linux主流distributions上编写调试并部署.net程序。
2. .net core 简介
2.1 .net core是什么
.net core是一个开源通用的开发框架,支持跨平台,即支持在window,macos,linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用。.net core的源码放在github上,由微软官方和社区共同支持。
它和传统的.net framework,属于“子集—超集”的关系,或者你也可以简单地认为它就是.net framework的跨平台版本(基于bcl的层面上看)。这是因为在当前版本中(1.0),.net core中的大部分核心代码都是从.net framework中继承重写的,包括runtime和libraries(如gc, jit, 部分类型)。
吐槽:只能感谢微软《clr via c#》不用白看呀,我之前看了得有小半年才看完
现在的.net core 1.0版本是一个很小的核心,apis和工具也并不完整,但是随着.net core的不断完善,补充的apis和创新也会一起整合到.net framework中。也就是说,.net core微软会同时更新.net framework和.net core,他们就像俩兄弟,共同努力致富(致谁的富?当然是.net开发者们),实现所谓的天下大同,也就是.net 标准2.0
这里不得不提到一个叫做.net standard library概念。作为.net平台apis开发官方支持标准,它要求所有的.net框架apis都遵循向下兼容。比如说.net framwork 4.6支持.net standard library 1.3,.net framwork 4.6.2框架支持.net standard library 1.5,而.net core 1.0框架支持1.6标准。
最终展望如下:
2.2 .net core的组成
①.net runtime
即coreclr。如之前所说,coreclr与.net framework的clr并没有什么区别,进程管理,gc,jit(ryujit 编译器)这些部分也都是一样的,只是针对服务器系统做了相应优化。现在clr和coreclr也在进行同步更新,只是可以肯定的是,coreclr才是.net的未来,clr将作为兼容手段而存在
②framework libraries,
即corefx。包括集合类,文件系统处理类,xml处理类,异步task类等
③sdk tools 和 language compilers (sdk工具和编译器)
即cli工具和roslyn编译器。可以通过.net core sdk(.net core开发工具包)获取。
④dotnet'app host
用来选取并执行对应运行时,提供组件载入原则和启动.net core应用程序。sdk也是通过相同程序启动。
tips:是不是想起了mscoree.dll这个垫片,它同样承载着windows平台上为.net应用程序选择clr版本的工作
2.3 .net core的特性
①跨平台
可以在windows,macos,linux上运行
②灵活的部署机制
1.portable applications(便携式应用)
这种部署机制和传统的.net framework相似,只要目标平台上存在.net core runtime即可。
2.self-contained application(自宿主应用)
顾名思义,这种部署机制将应用和运行时共同打包,即便目标平台上没有安装.net core runtime也能正常使用
第二种方式和.net native也是不一样的,仍然使用coreclr,而.net native使用corert作为运行时,详细信息请见dotnet/corert
③命令行工具
.net程序所有的运行脚本都可以用命令行工具执行(cmd,bash)这里有几个常见的donnet命令
指令 | 帮助 |
---|---|
dotnet new | 产生新的基本 .net 项目内容 (包含 project.json、program.cs 以及 nuget.config |
dotnet restore | 还原所参考的 nuget 包 |
dotnet build | 建造 .net 项目 |
dotnet publish | 产生可发行的 .net 项目 (包含所属的 runtime) |
dotnet run | 编译与立即运行 .net 项目 (较适用于 exe 型项目) |
dotnet repl | 引导交互式的对话 |
dotnet pack | 将项目的产出封装成 nuget 包 |
④兼容性
通过.net standard library与.net framework,xamarin,mono兼容
⑤开源
.net core从属于.net基金会,由微软进行官方支持。使用mit和apache 2开源协议,文档协议遵循cc-by
2.4 开发语言
.net core 1.0版本中支持的编程语言仅有c#(f#和vb暂未实现),这里还要提到一个开源的语言编译器roslyn,它负责将代码编译成我们熟悉的il语言,然后再借由aot或jit编译器编译成机器熟悉的机器语言。
3. get started
以下内容演示在windows10和centos 7.2下的命令行生成和发布demo
3.1 win 10
3.1.1 安装.net core sdk和.net core runtime
.net core sdk = 使用.net core开发应用.net core runtime 和 sdk+cli 工具
3.1.2 简单的运行结果
打开cmd,依次输入mkdir .project(创建目录),cd .\.project(进入目录),dotnet new(新建初始项目),dotnet restore(还原依赖),dotnet run(运行)即可运行第一个hello world程序
3.2 centos 7.2(本地hyper-v)
3.2.1 安装和运行
详情请见: ,大致命令如下
sudo yum install libunwind libicu #安装libunwind,libicu包 curl -ssl -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=809131 #下载dotnet-dev-centos-x64.1.0.0-preview2-003121.tar文件,有时会因为网络问题下载较慢,耐心等待即可,当然也可以手动下载后放到目录下。 sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -c /opt/dotnet #创建目录并解压已下载文件 sudo ln -s /opt/dotnet/dotnet /usr/local/bin #将目录链接到$path下,否则dotnet命令无法识别 mkdir hwapp cd hwapp dotnet new #创建默认.net core应用 dotnet restore #还原依赖包 dotnet run #运行,结果将显示hello world!
第六行命令后可使用dotnet --info查看是否链接成功,显示如下
.net command line tools (1.0.0-preview2-003121) product information: version: 1.0.0-preview2-003121 commit sha-1 hash: 1e9d529bc5 runtime environment: os name: centos os version: 7 os platform: linux rid: centos.7-x64
以上步骤在.net core官方网站都可以找到,可以看到应用在经过简单的dotnet new, dotnet restore, dotnet run命令后就跑起来了,但是这其实是类似于开发环境中的调试运行,而且win上new的应用此时也不能直接跨平台到linux下运行,所以我们又得提到dotnet publish命令了
3.2.2 self-contained applications 发布
(1) 修改project.json文件
我们现在win10下按照步骤new一个新的hw控制台应用self,按照官方文档要求,我们需要用以下内容替换原来project.json文件(删除"type": "platform",并增加runtimes节点)
{ "version": "1.0.0-*", "buildoptions": { "debugtype": "portable", "emitentrypoint": true }, "dependencies": {}, "frameworks": { "netcoreapp1.0": { "dependencies": { "microsoft.netcore.app": { "version": "1.0.0" } }, "imports": "dnxcore50" } }, "runtimes":{ "win10-x64":{}, #win10平台 "centos.7-x64":{} #centos7.2平台 } }
(2) 执行restore和publish操作
之后执行dotnet restore指令,针对平台进行还原操作。该步操作耗时较久,虽然只是两个平台,第一次也花了较长时间。紧接着进行进行dotnet publish -r centos.7-x64 -c release。
dotnet publish指令详见dotnet-publish - packs the application and all of its dependencies into a folder getting it ready for publishing
(3) 在linux平台上运行
上述操作后,我们只需要将发布后的文件夹(bin/release/netcoreapp1.0/centos7-x64/publish,包含self.exe)上传到linux root目录下project(新建)文件夹中, 在shell中输入指令
修改可执行权限后,即可成功运行“hello world”,这就是我们“self-contained applications”方式的部署方法
4. 总结
4.1 尾声
至此,.net core的学习便告一段落了,以上内容简单介绍了.net core的组成和特性,同时也在windows和linux系统上通过两种不同的部署方式成功运行了示例。相比较之前的.net framework傻瓜式部署,.net core的新奇真是让我眼前一亮。接下来,我也会将.net core和asp.net core的学习记录下来,欢迎指正。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。