厚积薄发,拥抱 .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 的出现能为我们指向一条明路,就像森林里一缕阳光,带来希望。

原文地址:http://www.cnblogs.com/OceanEyes/p/dotnet_2016_overview.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

CGLIB 实现代理对象API

转载自 CGLIB 实现代理对象API1. 加入库cglib库cglib-2.2.jarasm库(cglib 需要asm库,如果没有加入asm的jar文件,就会报asm错误)asm-3.1.jar 2. 定义CGLIB操作类package com.machome.cglibtest;import java.lang.reflect.Method;import com.machome.model.StuService;import net…

android java split_Java中的split函数的用法

Java中的 split 函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回;例如:String str"1234abc";String[] a str.split("");System.out.println("处理结果: "a[0]","a[1]); //输出的…

第二章指南(4.2)添加 Controller

原文:Adding a controller翻译:娄宇(Lyrics)校对:刘怡(AlexLEWIS)、何镇汐、夏申斌、孟帅洋(书缘) Model-View-Controller (MVC) 架构模式将一个应用程序分离成三个主要的组件: Model、View 以及Controller 。 MVC 模式帮助你创建…

jdk和cglib简单理解

转载自 jdk和cglib简单理解之前使用cglib的时候不需要将classLoader作为参数传入,但动态代理却要,带着这个疑惑进入这个方法:Proxy.newProxyInstance(classLoader, interfaces, InvocationHandler)要在classLoader里去找interfaces&#xff0…

mysql引擎总结_MySQL存储引擎对比总结

存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种。这篇文章主要是对其进行一个总结和对比。一、引言在mysql5之后,支持的存储引擎有十几个&#xff0…

DotNet Core 介绍

前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章来帮助那些还在学习的朋友们吧。 目录 dot…

jdbc java_Java中使用JDBC

JDBC简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。本文中中使用的数据库数据库软件:MySQL5.6数据库:test表&…

动态代理proxy与CGLib的区别

转载自 动态代理proxy与CGLib的区别昨天被人问及动态代理与CGlib的区别,赶紧回顾一下: 什么是代理?静态代理与动态代理静态代理实例JDK动态代理实例CGLib 简介CGLib 与JDK动态代理的区别代理模式是Java中常见的一种模式,英文名字叫…

【干货】”首个“ .NET Core 验证码组件

前言 众所周知,Dotnet Core目前没有图形API,以前的System.Drawing程序集并没有包含在Dotnet Core 1.0环境中。不过在dotnet core labs项目里可以见到MS已经在移植这个项目,不过目前的版本只能在Windows上和NET541或DNX环境中才可以使用。 不过…

java 招聘要求_Java程序员如何进阶,一般招聘都有哪些要求?

作为当前市场上应用领域最广、人才需求最大的编程语言,Java一直是人们入行IT行业的选择。然而,随着大批量的人涌入Java开发行业,企业的招聘门槛也在无形中抬高,提升专业技能成为新手Java程序员实现升职加薪的有效途径。分析各大招…

朝花夕拾——Java的synthetic修饰词

转载自 朝花夕拾——Java的synthetic修饰词Ok,目前为止,我还只是Android coder,一切对其他的学习都是以Android 为主线的支线任务。所以为什么会提到这个方法呢?是来自于google官方的性能建议文档的这样一句话:Consid…

asp.net MVC 应用程序的生命周期

首先我们知道http是一种无状态的请求,他的生命周期就是发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序的生命周期和一个请求,从一个控件到另一个控…

java 刷新界面_利用java如何实现在删除信息后刷新页面功能

利用java如何实现在删除信息后刷新页面功能发布时间:2020-11-17 14:25:49来源:亿速云阅读:74作者:Leah这篇文章给大家介绍利用java如何实现在删除信息后刷新页面功能,内容非常详细,感兴趣的小伙伴们可以参考…

Java中的synthetic

转载自 Java中的synthetic 有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。 下面我给大家介绍一下synthetic 下面的例子…

java凯撒密码_JAVA凯撒密码 选择问题

以下是加密和解密的程序:加密:importjava.io.*;classJiami26{publicstaticvoidmain(Stringargs[])throwsIOException{charb[];//存放密文BufferedReaderbr2newBufferedReader(newIn...以下是加密和解密的程序:加密:import java.io…

synthetic Java合成类型

转载自 synthetic Java合成类型Synthetic看Class源码的时候,看到有个关键字Synthetic以及isSynthetic()方法,遂有兴趣查阅了一番。   一开始以为,就是复合类型(引用类型),也就是非基本类型,…

Java 反射机制深入研究

转载自 Java 反射机制深入研究Java反射机制深入研究Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否…

RAML用户应遵循的C#与Web API代码生成模式

在过去几年间,REST规范的各种语言正在逐渐流行起来,例如RAML、Swagger以及API Blueprint。但这些语言的主要范畴在于客户端工具,主要用于生成JavaScript或TypeScript文件、模拟对象(mock),以及对应的客户端…

wxpython使用folium_wxPython实现文本框基础组件

本文实例为大家分享了wxPython实现文本框的具体代码,供大家参考,具体内容如下#-*- coding:utf-8 -*-"""#############################################StaticText 参数说明 --即 labelparent: -- 父窗口部件。id:…

教你实践ASP.NET Core Authorization(免看文档教程)

准备 创建一个名为AuthorizationForoNetCore的(web)解决方案,选择Empty模板添加相关nuget包引用Microsoft.AspNetCore.Mvc(选择最新版本)编辑Startup.cs文件,添加mvcservice并进行默认路由配置 添加Controllers文件夹&…