通过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方法(可以定义成实例方法或者静态方法)。
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)的更多相关文章
- In-Memory:内存数据库
在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统 ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- H5实现摇一摇技术总结
摇一摇遇到的问题 一.如何对摇晃效果进行反馈 刚开始的处理方式是,摇晃过程中不做任何处理,但后来反馈说这种效果不好,好像就没有摇动一样,如果声音也不响的话,就真的和什么都没发生一样. 后来想了想,加入 ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
- C# 在腾讯的发展
本文首发我的微信公众号"dotnet跨平台", 内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处. .NET 主要的开发语言是 C# , .NET 平台泛指遵循EC ...
随机推荐
- BZOJ2506: calc
Description 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值 ...
- html5shiv.js and respond.min.js
因为用到这两个插件,所以记录下来.. html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min:让不支持Css3 Media Quer ...
- MySQL中EXPLAIN命令详解
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- 原生js移动端touch事件实现上拉加载更多
大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...
- Python模块之常用模块,反射以及正则表达式
常用模块 1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...
- Jenkins部署配置简介
前段时间研究了一下自动化测试,因而接触到了Jenkins,今天有时间进行一下Jenkins部署配置相关知识的总结分享 前言:由于本次只是实验性研究,采用Windows环境,因此Jenkins可以通过下 ...
- IntelliJ IDEA 15 激活码 正版 可离线激活
43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- Android 中关于ListView分割线的设置
今天发现许多App上的listview的item之间的分割线都只显示了右边一部分,而左边的那一半则没有,第一反应则是给分割线设置一张背景图片就ok了: android:divider="@m ...
- doduicms 手机和pc同步 链接处理
sitem.aspx 加上 Session.Add("ismobile", "1"); string mobile = HttpContext.Current. ...
- c++用法的学习心得
关于C++这门课,是我在大一的时候开始学习的,那时候接触的就是单纯的一些C++的基本语法规则,基本的编程规则.但是我们都有这样的困惑:课堂和教材的 内容基本上都能接受和理解,但真要实际动手编写程序又感 ...