微软在开发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方法(可以定义成实例方法或者静态方法)。

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权限)。

@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进行升级。

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)

通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)的更多相关文章

  1. In-Memory:内存数据库

    在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统 ...

  2. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  3. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  4. H5实现摇一摇技术总结

    摇一摇遇到的问题 一.如何对摇晃效果进行反馈 刚开始的处理方式是,摇晃过程中不做任何处理,但后来反馈说这种效果不好,好像就没有摇动一样,如果声音也不响的话,就真的和什么都没发生一样. 后来想了想,加入 ...

  5. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  6. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  7. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  8. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  9. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  10. C# 在腾讯的发展

    本文首发我的微信公众号"dotnet跨平台", 内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处. .NET 主要的开发语言是 C# , .NET 平台泛指遵循EC ...

随机推荐

  1. iPhone开发基础教程_第二章

    1.各个子文件夹的作用        Classes:                    编写的大多代码都保存在这里,其中包括所有的Objective-C类,可以在Classes文件夹下创建一些子 ...

  2. iOS推送原理

    1.首先app会和apns建立长连接,会发送 udid和 bundle id给apns 2.apns会返回给app一个device token 3.用会把device token 发给自己的服务器 4 ...

  3. 踏上Salesforce的学习之路(二)

    一.添加一个字段到对象中 1.给Merchandise对象添加一个Price字段 先点击右上角姓名旁边的Setup(不管你在哪个页面,点击Setup都能让你快速的回到首页,如下图所示),然后在左侧的Q ...

  4. AngularJS:自定义过滤器

    表达式:         {{ expression | filter1 | filter2 | ... }}         {{ expression | filterName : paramet ...

  5. 为什么我如此热爱这样一个比赛(转自vici)

    为什么我如此的热爱这样一个比赛呢?因为它总能带给我一个目标,让我去努力实现它.因为可以看到胜利的希望,于是不断的去追逐.虽然其中的过程可能是比较艰辛的.   对于天才选手,作为天生的冠军,大概凭借天赋 ...

  6. git使用手册

    1.git常用命令 >>首先做git clone 形成本地repository: >>然后做checkout形成分支 列出所有分支  $ git branch –r 切换到新分 ...

  7. EditPlus快捷键

    Editplus 选中一行: ctrl+rEditplus 复制一行: ctrl+r选择行,然后ctrl+c复制.复制一行到下一行中:Editplus有:Ctrl+j 复制上一行的一个字符到当前行Ed ...

  8. solr查询语句示例

    url示例:sort=id+desc&&fq=date_time:[20081001 TO 20091031]&wt=json&json.nl=map&q=st ...

  9. daima

    # -*- coding: utf-8 -*- import theano import theano.tensor as T import numpy as np from sklearn impo ...

  10. WinForm窗体 SSK 界面的使用

    1.下载 SSk文件 找到  IrisSkin2.dll 文件和.SSK结尾的文件    为了防止万一粘贴到项目的bin>Debug下面 2. 打开工具箱   添加一个选项卡 3. 添加选择项& ...