通过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 ...
随机推荐
- Unity Android加密DLL笔记
unity mono 地址:https://github.com/Unity-Technologies/mono 下载与unity版本对应的unity mono. brew安装:http://brew ...
- vmware下的centos上网配置
设置网络 1.查看网络配制 刚刚安装好的虚拟机,里面还是原始的网络配制.只有一个回环网卡. 通过ifconifg命令可以查看到. 2.添加网卡 从上面看到只有回环网卡,现在需要添加一块网卡来进行后 ...
- iOS 中自定义 cell,点击cell的时候文字不出现的原因
解决方案: 在setSelected方法中设置要显示label的背景颜色即可
- 如何通过倾斜摄影数据手动配置s3c索引文件?
如何通过倾斜摄影数据手动配置s3c索引文件? 大家知道,倾斜摄影数据最常见的是OSGB格式,并且是由一个一个的Tile分级文件夹构成的Data文件夹.结构一般如下图所示: 那么,如何才能把模型的各个瓦 ...
- phpstudy虚拟机配置
PHPStudy是一个常用的PHP本地环境搭建的一个程序包,方便实用.对学习PHP的新手来说, WINDOWS下环境配置是一件很困难的事;对老手来说也是一件烦琐的事.因此无论你是新手还是老手,该程序包 ...
- 高级sql注入
1. 避开输入过滤 输入过滤存在于外部和内部,外部属于web应用防火墙WAF,入侵防御系统IPS,入侵检测系统IDS,内部属于代码中对输入进行过滤 过滤select,insert等sql关键字和' | ...
- react-native 环境搭建以及项目创建打包
参考:http://www.lcode.org/%E5%8F%B2%E4%B8%8A%E6%9C%80%E8%AF%A6%E7%BB%86windows%E7%89%88%E6%9C%AC%E6%90 ...
- ASP.NET Core中显示自定义错误页面-增强版
之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 谈谈UI架构设计的演化
谈谈UI架构设计的演化 经典MVC 在1979年,经典MVC模式被提出. 在当时,人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来,而Trygve Reenskaug在跟一些人的讨 ...