了解ASP.NET 5
通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)
微软在开发ASP.NET 5(当时被称为ASP.NET vNext)是采用的代号为Project K,所以运行时被称为KRuntime。KRuntime是一个SDK,它包含了编译和运行应用程序的所有资源。接下来我们通过三个Hello World实例来演示如何利用KRuntime让我们编写的应用运行起来。这三个实例如此的简单,以至于我们根本不需要利用IDE(Visual Studio 2015)来编写,我们甚至无需安装VS 2015。
作为第一个Hello World应用,我们会编写一个包含入口点(Entry Point)的程序,并通过执行KRuntime的K.cmd命令来启动它。我们先创建一个空的目录并将其命名为“HelloWorld”,我们接下来创建的三个应用都保存在这里。接下来我们创建一个名称为“Project1”的子目录,它代码了作为第一个Hello World程序的项目,所有相关的源文件都保存在这里。我们直接在Project1目录下创建一个文本文件,并将其命名为“Program.cs”。我们直接利用NotePad来编写这个Program类。如下所示的是这个类型的定义,我们可以看到这个类型中包含了唯一的作为入口点的Main方法(可以定义成实例方法或者静态方法)。
1
2
3
4
5
6
7
8
9
10
11
12
|
using System; namespace Project1 { public class Program { public void Main() { Console.WriteLine( "Hello World!" ); } } } |
KRuntime眼中的项目是一个目录,能够成为项目的目录必须具有一个名称为“project.json”的文件。这是一个采用JSON格式的文本文件,与当前项目编译/运行相关的配置均定义与此。换句话说,我们熟悉不过的web.config在ASP.NET 5项目已经不再需要了,而project.json不仅仅是web.config的替代者,更多的配置信息被放置在这里。我们在Project1目录下添加这样的project.json文件。由于我们的应用是如此简单,我们不需要在此定义任何配置,所以我们将内容定义为“{}”。
到目前为止,我们第一个Hello World就定义好了,现在我们可以执行KRuntime提供的K.cmd以命令行的方式启动它。KRuntime的核心是KRE(KRuntime Enviroment),不仅多个版本的KRE可以在同一台机器上并存,同一个应用程序可以采用不同版本的KRE来运行。KRE的安装、升级和相关设置(比如设置默认的KRE)通过KVM(K Version Manager)来完成。我们可以执行如下命令来下载和执行相应的脚本来安装KVM(KVM的安装时针对当前用户的,所以需要当前用户具有Admin权限)。
1
|
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1'))" |
成功安装KVM后,在%USERPROFILE%目录(默认为“C:\Users\{UserName}”)下会创建一个名为.kre的子目录,命令文件“kvm.cmd”被拷贝到其下的“\bin”目录下。接下来我们以如下的方式执行这个命令并采用upgrade参数来安装新的KRE或者将对现有的KRE进行升级。
1
|
kvm upgrade |
在确保KRE已经安装在你机器上之后,我们启动Visual Studio 2015(目前为Preview版本)的命令行工具“Developer Command Prompt for VS 2014”(照理说应该命名为“Developer Command Prompt for VS 2015” 在VS 2015 Preview版本中确实是“2014”)或者直接使用CMD命令行。在将Project1目录作为当前目录(执行CD命令)后执行按照如下的形式执行K run命令之后(我将HelloWorld目录保存在C:\下),我们的程序被成功执行。
我们在通过执行K run命名启动程序之前并没有执行任何编译操作,所以K run会自动帮助我们对目标项目进行编译。实际上这是一个动态编译的过程,具体的编译是 通过一个名叫Roslyn的编译器完成的。具体来说,编译器会将当前目录(%CD%)作为目标项目的根目录,根据project.json的设置来选择相应的源文件进行编译。对于我们的程序来说,我们不曾在project.json中定义任何配置,所以目录下的.cs文件(Program.cs)会默认作为源文件编译到生成的程序集中(程序集会以项目的根目录进行命名,所以编译生成的目标程序集名称为Project1.dll)。
成功编译之后,目标程序集中的以Program命名的类型被解析出来,定义其中的Main方法将会作为入口程序被执行。具体来说,如果这是一个静态方法,该方法会被直接执行;如果这是一个实例方法,一个Program对象被创建出来,它的Main方法随之被执行。关于程序入口的解析,有一点值得提醒一下:一般来说定义在启动程序中唯一的静态Main方法会默认作为入口点,但是只有定义在Program类中的Main方法才会被视为合法的入口点。除此之外,K.cmd并不要求Main方法是静态的。它也并不要求Program类具有无参构造函数,因为在实例化Program对象的时候,内置的DI容器能够自动提供相应的参数。
对于上面创建的这个Hello World应用来说,程序入口点由应用自身来提供,所以应用本身具有自我执行的能力。从应用托管(Host)的角度来讲,这样的应用同时负责对自身的托管。将应用与托管环境独立起来其实是更好的选择,因为这样可以使同一个应用运行于不同的环境中。在下一篇中我们就来演示如何为应用指定入口程序来达到应用与应用托管的分离。
通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)
通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)
通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(3)
了解ASP.NET 5的更多相关文章
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
- Asp.Net Mvc 使用WebUploader 多图片上传
来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET_各个币种之间的汇率转换(实时)使用Yahoo汇率。
近期开发支付平台的时候有运用到各国的实时汇率之间的转换问题,于是在往上找了很多相关资料,以下就是一些参考网址: 1.提供API接口的网站:https://www.showapi.com:这个网站有提供 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- Asp.net Core中使用Session
前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...
随机推荐
- Javascript J更深层次的理解avascript 基础知识
eval全局函数 dojo loader会看到如下的功能 var eval_ = new Function('return eval(arguments[0]);'); //Function 函 ...
- 8.19! 今天我有18生日,点击阅读或顶部 尾随幸运的一天!生日知识!↓——【Badboy】
话说得生疼.我已经想到了17那年,那是一年的时间!我在这里7.24我认为这是我的生日 结果到处宣传 ,首页疑问发现自己是错的生日 按照农历计勒把我羞辱. 不依照原农历7.24的 今天的国家今天的日历 ...
- Java 新特性(5) - Java EE 5 新特性
Java EE 5 由 Java Community Process 通过 Java Specification Request 244 发布,这个 “总纲” JSR 指出了详细描述 Java EE ...
- hdu4570Multi-bit Trie (间隙DP)
Problem Description IP lookup is one of the key functions of routers for packets forwarding and clas ...
- strchr,wcschr 及strrchr, wcsrchr,_tcschr,_tcsrchr函数
strchr,wcschr 及strrchr, wcsrchr,_tcschr,_tcsrchr函数 (1) char *strchr( const char *string, int ...
- Andio Studio
坑一:layout文件中提示(见图):(关键词检索:因为百度和google的时候都没看到这个东东,只在stackoverflow上看到这个提问,但是还没人回答.希望大家可以百度到我这条) ①:Chec ...
- SOA两个接口通常用于实现更:SOAP vs REST
SOA协作架构异构系统,因此,一个跨操作系统的需求.跨语言的通用信息交换格公式. SOAP和REST它们是基于消息正文文本,在跨平台方面相比二进制消息优点.因此,作为选择SOA实施通常用于界面.但SO ...
- newlisp获得bash该命令的退出状态
newlisp exec你可以运行bash命令.但如何返回状态来运行它? 特别是,我需要监控hdfs dfs -test 结果返回.经过一番摸索,我发现了一个简单的答案: #!/usr/bin/new ...
- js之按键总结
js 实现键盘记录 兼容FireFox和IE 2009-01-07 11:43 作者:羽殇仁 转载请注明出处,谢谢. 本篇文章是我的第一百篇blog文章,恭喜一下! 这两天突然想弄弄js的键盘记录,所 ...
- Oracle 树操作
Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...