NET 2016
.NET 2016
厚积薄发这个词是高三英语老师在高考前写在黑板上,高中三年努力这么久,是时候迎面而上,冲刺向前。所以,一想到.NET 2016,脑海里蹦出的第一个词就是它。 .NET 2016 是 .NET 一次质的飞跃,不管难易,我们需要拥抱变化。
初识 .NET 2016
- .NET 2016 概览
.NET 2016 作为 .NET 技术最新发展,如下图所示,它主要包含三大块:
最左边代表的是 .NET Framework 4.6,WPF、ASP.NET 4.x、ASP.NET Core 1.0 能运行在它上。中间这部分代表的是 .NET Core 技术,ASP.NET Core 1.0 和 Universal Windows Platform(UWP)能运行在它之上。当然,你也可以创建控制台应用程序运行在.NET Core 上。最右边是 Xamarin,它是一个基于 Mono 的跨平台移动开发框架。
在.NET 2015 时,微软为我们带来了全新的 .NET,它就是.NET Core。.NET Core 的一个重要组成部分是新的运行时(Runtime):CoreCLR。除了使用 CoreCLR 运行时外,.NET 也能被编译成 Native Code。UWP 自动使用这个特性,应用程序在提交到 Windows Store 后被编译成 Native Code,最终生成优化过后的代码,可以让 APP 启动时间加快并可以减少内存消耗 。你当然也能编译其他.NET Core 应用程序成 Native Code,并在Linux运行。
在上图的底部,你可以看到有一些东西在.NET Framework 4.6、.NET Core、Xamarin 之间共享。比如一些共享的Libraries,通过 Nuget 包的概念将这些 Libraries 汇集在 Package 中供所有的.NET 平台使用。还有一些运行时组件(Runtime Components)被共享,如 GC 和 RyuJIT,这是一个新的JIT编译器,这个新的 JIT 编译器不仅比以前更快,在调试时它还具有更好的支持编辑和继续功能。这个功能可以在调试时编辑代码并继续调试,而不需要停止和重新启动进程。CLR、CoreCLR、.NET Native 使用 GC 进行实例的销毁以及内存的回收,并且 CLR 和 CoreCLR 使用 RyuJIT 编译器将 IL 代码编译成 Native Code 。当然,新的编译器 Roslyn 也是共享的。
- .NET Framework 4.6
.NET Framework 4.6 作为 .NET Framework 的最新版本,在过去 10 多年间,不断被增强。我们利用这个 Framework 构建 Windows Form 、WPF、ASP.NET 4 等应用程序。尽管 ASP.NET Core 应用程序运行在.NET Core 上,但它也能运行在.NET Framework 4.6 上。
如果你想要继续使用 ASP.NET Web Form 开发应用程序,.那么 NET Framework 4.6 中的 ASP.NET 4.6 是你的最佳选择。值得注意的是你不能在.NET Core 上运行 ASP.NET Web Form 应用程序。
- .NET Core 1.0
.NET Core 1.0(目前是 RC2),是新的.NET,相比于 Mono,它是真正意义上跨平台的实现。.NET Core 被设计成模块化的方法,即被分割成大量的 Nuget Package。在应用程序中,你决定需要哪些 Package,并且随时保持更新和卸载。而.NET Framework,它是操作系统的一部分,注定不能实时被更新,同时,过去 10 多年件,.NET Framework 加入非常多的新功能,它变得越来越大,更糟糕的是,它不可能移除不再需要的旧功能。比如旧的集合类不再被使用因为泛型集合类加入,.NET Remoting 被新的通信技术 WCF、ASP.NET Web API 替换,LINQ to Sql 被 EntityFramework 替换。而这些旧技术,一直存在.NET Framework 中,你不得不全盘接受他们。
- Xamarin
Mono 是开源社区开发的跨平台.NET Framework,而 Xamarin 是一个构建于 Mono 上跨平台移动应用开发框架。相信微软收购了 Xamarin 之后,Mono 将得到大力支持,.NET Core 在移动端的表现拭目以待。
使用 .NET Framework 4.6 编译应用程序
创建 “Hello World” 应用程序是学习一门新技术的开篇。在这儿,为了更好的去理解.NET Core,我们不打算去使用Visual Studio 2015 进行开发。
- Developer Command Prompt 编译代码
当安装完毕 Visual Studio 后,我们可以通过配套工具 Developer Command Prompt 使用 C# 编译器编译代码。
1.打开记事本,使用 C# 编写如下代码,命名为 HelloWorldApp.cs 并保存至 C:\Code 文件夹
class Program { static void Main() { System.Console.WriteLine("Hello World");}}
2.启动 Developer Command Prompt for VS2015,键入如下命令:
- 进入 C:\Code 文件夹 cd C:\Code
- 使用 C# 编译器编译源代码 csc HelloWorldApp.cs
- 查看文件目录结构 dir
- 输入EXE 名来运行应用程序 HelloWorldApp
运行结果如下所示:
注意你的源代码文件 HelloWorldApp.cs,已经编译到程序集HelloWorldApp.exe 中。当你输入 HelloWorldApp 名来运行应用程序,最终被.NET Framework 4.6 和它的 CLR 加载并运行。
- 使用 ILDASM 反编译程序集
1.C# 编译器将源代码转换成IL代码后存储到程序集中(DLL 或者 EXE)。
2.IL 代码语句就像汇编语言指令,它们被.NET 的虚拟机也就是 CLR执行。在运行时,CLR 从程序集中加载 IL 代码,然后 JIT 编译器编译成 Native Code,最后交由 CPU执行。
在 Developer Command Prompt 输入 ildasm HelloWorldApp.exe,你会看到ILDASM 工具加载编译过后的程序集:
双击 MANIFEST 节点,查看元数据:
可以看到.NET Metadata 的版本是 4.0.30319,并且依赖外部的程序集mscorlib,它的版本是4.0.0.0,上述截图告诉我们,要运行这个应用程序需要安装.NET Framework 4.0以上。
关闭 MANIFEST 窗口,再展开 Program 节点,双击 Main 方法:
注意IL 指令:ldstr(load string ),nop(no operation ),call,ret(return)。记住IL 最终被 CLR 执行。
使用 .NET Core CLI 编译应用程序
要使用最新的.NET Core Command Line(CLI),请确保安装了.NET Core 和 CLI Tools。你可以访问 https://dotnet.github.io/来为 Windows、Linux、OS X 安装它们。
成功安装.NET Core CLI Tools 之后,可以在 Developer Command Prompt 键入 dotnet help 来 查看具体使用:
- 使用 CLI 创建.NET Core 应用程序
你需要通过 Developer Command Prompt 使用如下命令:
1.再次进入 C:\Code 文件夹 cd c:\code
2.创建新文件夹 mkdir SecondApp
3.进入新文件夹 cd SecondApp
4.使用 CLI 创建.NET Core应用程序 dotnet new
5.查看目录结构 dir
dotnet new 命令创建了一个新的.NET Core 应用程序,包含两个文件,分别是 Program.cs 和 project.json。
Program.cs 是个简单的控制台应用程序,输出“Hello World”
using System;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
而另一个文件:project.json,它是项目配置文件,并以JSON的格式定义了应用程序的基本信息,比如:version、buildOptions、authors、dependencies、frameworks 等。
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}
上述JSON 格式中,由于 Main 方法作为应用程序的入口(Entry Point),所以需要将 buildOptions 节点下的emitEntryPoint 属性设置为 true。
dependencies 节点代表应用依赖的 packages,默认情况下只添加了 Microsoft.NETCore.App 的依赖。值得注意的是,Microsoft.NETCore.App 是一个引用类型的Nuget Package,它又引用了其他的Nuget Package。这样的好处是避免添加大量的其他package。
framewors 节点列出了应用程序支持的 frameworks。默认情况下,应用程序只支持.NET Core 1.0,以别名 netcoreapp1.0 表示。netcoreapp1.0 下的 imports 节点 引用旧名称 dnxcore50。这允许我们仍旧可以使用旧名称的 package。
最后,通过dotnet restore 下载所需要的依赖项
通过 project.lock.json,查看具体下载的 package 版本。
为了编译应用程序,使用命令 dotnet build。
最后,使用 dotnet run 运行应用程序。
值得注意的是,在 framework 中也可以添加应用程序对其他 frameworks 的支持,添加字符串net46,表示当前的控制台应用程序构建于.NET Framework 4.6之上:
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
},
"net46":{}
}
遗憾的是,dotnet build 之后,发生了异常。如下所示(注:当前版本是.NET Core RC 2),
可以看到异常信息是 System.Runtime.Loader 不支持.NET Framework 4.6。只是一个很笼统的信息,个人猜测 Runtime Loader 只支持 CoreCLR 的加载,在 Github(https://github.com/dotnet/corefx/issues/8453) 中,也应证了我的观点。暂时的解决方法是将dependencies 节点 移入到frameworks 下的 netcoreapp1.0 中:
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50",
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
}
}
},
"net46":{}
}
}
dotnet build 之后,分别生成两个文件夹 net46 和 netcoreapp1.0,使用 ILDasm(见上一小节)工具,打开文件夹可以看到他们之间一个很重要的区别,使用.NET Framework 的应用程序编译之后为生成包含 IL 的 EXE 应用程序并且依赖mscorlib程序集 ,而使用.NET Core 的应用程序编译之后生成包含 IL 的DLL,依赖System.Console 和 System.Runtime 程序集。
最后,通过 dotnet run --framework net46 指定 famework 的版本为.NET Framework 4.6 查看运行结果。
最后,通过 CLI 你可以 打包(dotnet pack)和 发布(dotnet publish)应用程序。
dotnet pack 创建了一个 NuGet Package:
它是一个后缀名为 nupkg 的 Nuget Package,你可以将它改为.zip,解压查看里面的内容。
dotnet publish
发布一个可用于部署.NET 项目(包括runtime)。
小结
告别.NET 开发一年多,没想到发生了这么多不可思议的技术,抓紧时间补充一下。我招过人,也求过职,深切体会到国内.NET 的生态环境不给力,希望.NET Core 的出现能为我们指向一条明路,就像森林里一缕阳光,带来希望。
NET 2016的更多相关文章
- Be Better:遇见更好的自己-2016年记
其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...
- Connect() 2016 大会的主题 ---微软大法好
文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman
美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.9 是第三天, Scott Hanselman 做Keynote.今天主题围绕的是.NET ...
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 2 Keynote: Miguel de Icaza
美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.8 是第二天, Miguel de Icaza 做Keynote,Miguel 在波士顿Xa ...
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter
“.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社 ...
- 微软发布正式版SQL Server 2016
微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...
- Summary of Critical and Exploitable iOS Vulnerabilities in 2016
Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...
- 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结
黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- SQL Server 2016白皮书
随着SQL Server 2016正式版发布日临近,相关主要特性通过以下预览学习: Introducing Microsoft SQL Server 2016 e-bookSQL Server 201 ...
随机推荐
- 再次复习数据结构:c语言链表的简单操作
最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...
- WebRTC–getUserMedia-filter
示例说明:抓取MediaStream的一帧数据,并对该帧数据使用Css滤镜效果. 步骤: 1. 由getUserMedia方法获取一个可用的MediaStream 2. canvas方法drawIma ...
- NET Core 环境搭建和命令行CLI入门
NET Core 环境搭建和命令行CLI入门 2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文 ...
- 解决gerber-Failed to Match All Shapes for PCB问题
有效解决在Protel 99se导gerber时提示gerber-Failed to Match All Shapes for PCB出错问题如图 这种问题很好解决,打开这个窗口 操作方法如下图Emb ...
- QT 遍历目录查找指定文件(比较简单)
QString FindFile(const QString &strFilePath, const QString &strNameFilters){ if (strFilePath ...
- 一个i++和++i导致的严重的错误
当我曾经在写一个strlen的实现时,用递归写出了如下的代码: int strlen(const char *s) { if(*s=='\0') ; else ; } 程序一运行就崩溃了,why!都是 ...
- 服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台
服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台 服务器端开发(Python/C++)
- 【Web】CXF WebService 服务端和客户端 环境搭建及测试
cxf服务端 1.去官方下载对应的jar包:http://cxf.apache.org/ 2.maven配置相应jar包 3.修改web.xml,完成spring和cxf配置 <!-- Spri ...
- [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...