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 ...
随机推荐
- WPF DataGrid模拟click实现效果
WPF的DataGrid原生是不支持Click事件的,然而在开发过程中,经常遇到需要实现类似效果的. 举个栗子:表格第一列是一个CheckBox,需要实现功能点击行选中,再点击取消选中. 第一想法是R ...
- nginx 配置日志
http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $r ...
- VC++中的头文件包含问题
在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系).也就是需要互相声明.好了,这时候会带来一些混乱.如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已 ...
- 2013 ACM/ICPC Asia Regional Chengdu Online---1003
哈哈哈 #include <iostream> #include <cstring> #include <string> #include <cstdio&g ...
- STL之如何选择顺序容器
一.顺序容器的分类 顺序容器:vector向量.list链表.deque双端队列: 优先级最高的是vector向量,它的速度比较快,优点最多: 在程序设计中,容器可以切换: #include < ...
- A - Oil Deposits(搜索)
搜索都不熟练,所以把以前写的一道搜索复习下,然后下一步整理搜索和图论和不互质的中国剩余定理的题 Description GeoSurvComp地质调查公司负责探测地下石油储藏. GeoSurvComp ...
- goahead 移植
1.网上下载goahead-3.1.-0-src.tgz包 2.解压 tar -zxvf goahead-3.1.-0-src.tgz 3.编译 cd goahead-3.1.-0 make CC=a ...
- 在Windows下github展示代码
最近大爱Web编程,于是寻找各种代码中,然后就发现了GitHub这个网站,如果你知道Google Code,那么你就知道这个GitHub是做什么的了.不过GitHub主要是用作基于Git的分布式版本管 ...
- Ural 1297 Palindrome 【最长回文子串】
最长回文子串 相关资料: 1.暴力法 2.动态规划 3.中心扩展 4.Manacher法 http://blog.csdn.net/ywhorizen/article/details/6629268 ...
- QT 静态编译后中文可能会出现乱码
QT 静态编译后中文可能会出现乱码.这是因为处理文字编码的 libqcncodecs 库是以 plugin 形式存放在 QT 静态编译目录/plugs/codecs/libqcncodecs.a 文件 ...