了解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 ...
随机推荐
- Base64编码 概念和用途
Base64概念 什么是Base64? 依照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把随意序列的8位字节描写叙述为一种不易被人直接识别的形式.(The Base6 ...
- js 模块化的规范
The Module Pattern,模块模式,也译为模组模式,是一种通用的对代码进行模块化组织与定义的方式.这里所说的模块(Modules),是指实现某特定功能的一组方法和代码.许多现 ...
- Java 新特性(3) - JDK7 新特性
http://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ JSR292:支持动态类型语言(InvokeDynamic) 近 年来越来越多的基于 JV ...
- Android应用程序的组成部分和Manifest文件(转)
Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起:应用程序Manifest描述了每一组件和它们之间的交互方式,还用于指定应用程序元数据.其硬件和平台要求.外部库以及 ...
- 于XAML导入命名空间的代码
例如,下面的代码到指定的命名空间.不仅导入的命名空间,并且还为指定的命名空间前缀local.当然,你也可以指定一个前缀为另一个名称,这可以定义.导入后,市民可以在命名当前空间XAML使用代码.例如,在 ...
- AIX6.1/11.2.0.3在有关数据库SWAP一个BUG
昨天南京到客户服务数据库的优化调整,其中新上线,经过审查alert.log当日志现在是在过去一段时间内取得,每隔几个小时的时间滞后,班会报似的内容: Thu Aug 21 09:01:26 2014 ...
- Linux内核导出符号宏定义EXPORT_SYMBOL源代码分析
资源: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX &q ...
- JSP简单的练习-使用JDOM阅读xml文件
<%@ page contentType="text/html; charset=gb2312" language="java" %> <%@ ...
- 用户 'IIS APPPOOL\IdealTest' 登录失败解决方案
原文:用户 'IIS APPPOOL\IdealTest' 登录失败解决方案 运行MVC框架后可能会提示“用户 'IIS APPPOOL\IdealTest' 登录失败” 详细堆栈信息如下 说明: 执 ...
- Android经常使用的布局类整理(一)
Android经常使用的布局类整理 近期又回头做了一下android的项目,发觉越来越不从心,非常多东西都忘了,简单的页面布局也非常多写不出来,首先还是先整理一下一些会混淆的概念先 layout_wi ...