对于上面创建的这个Hello World应用来说,程序入口点由应用自身来提供,所以应用本身具有自我执行的能力。从应用托管(Host)的角度来讲,这样的应用同时负责对自身的托管。将应用与托管环境独立起来其实是更好的选择,因为这样可以使同一个应用运行于不同的环境中。接下来我们就来演示如何为应用指定入口程序来达到应用与应用托管的分离。现在我们在HelloWorld目录下创建两个子目录,并分别将它们命名为Project2和Project3。Project2代表应用本身,但是真正的入口程序则由Project3代表的项目提供,换句话说Project3是Project2 的宿主(Host)。两个项目对应目录及其源文件结构:

Project2
    Startup.cs
    project.json

Project3
    Program.cs
    project.json

 

我们在Project2目录下添加一个文本文件并将其命名为Startup.cs,并按照如下的方式定义一个同名的类型。

using System;

namespace Project2
{
public class Startup
{
public void Configure()
{
Console.WriteLine("Hello World!");
}
}
}

如上面的代码片断所示,我们在Startup类中定义了一个Configure方法,我们希望在应用的入口程序在正常启动并完成初始化之后自动回调这个方法。对于应用自身来说,Startup是被启动之后最先执行的类型,我们可以将一些针对应用的配置定义在Configure方法中。不过作为演示,我们仅仅让此方法在控制台上打印“Hello World”字样。

我们说过任何一个被KRuntime视为项目的目录必须包含一个project.json文件,所以我们需要在Project2目录下创建这个一个文本文件,我们指定的入口程序就定义在这个文件之中。如下所示的是这个project.json文件的内容,我们仅仅在其commands配置项中添加了一个名为“RunFromProject3”的命令,对应的值为“Project3 Startup Configure”,其中Project3代表包含入口程序的程序集(项目Project3被编译后生成的程序集)名称,Startup和Configure组成的字符串数组将作为程序入口方法(Main)的参数,它们分别表示应用启动程序所在的类型和对应的方法。我们同时在dependencies这个配置项中添加了针对Project3的项目依赖,这相当于在当前项目中添加了一个对应的项目引用。

{
commands:{
"RunFromProject3": "Project3 Startup Configure"
},
dependencies:{
"Project3":""
}
}

接下来我们在Project3目录下添加一个文本文件并将其命名为Program.cs,然后安装如下的形式定义这个作为程序入口的Program类型。与上面演示的第一个Hello World应用一样,作为程序入口的类型必须命名为Program,其中包含一个静态或者实例Main方法。如上面的代码片断所示,Main方法的目的在于解析定义在Project2的Startup类型,然后据此类型实例化一个对应的对象并调用其Configure方法。类型和方法的名称来源于Main方法的参数,而类型解析采用的程序集名称与当前目录(%CD%)名称一致。

using System;
using System.IO;
using System.Reflection;
using System.Linq; namespace Project3
{
public class Program
{
public void Main(string[] args)
{
string startup = args[0];
string configure = args[1];
string appBase = Directory.GetCurrentDirectory();
string appName = appBase.Substring(appBase.LastIndexOf('\\') + 1); Type startupType = Assembly.Load(new AssemblyName(appName))
.GetTypes().FirstOrDefault(type => type.Name == startup);
startupType.GetMethod(configure)
.Invoke(Activator.CreateInstance(startupType), new object[] { });
}
}
}

在完成对作为入口程序的Program类的定义之后,我们同样需要在Project3目录下创建一个必需的project.json文件。和第一个演示的Hello World应用一样,这里不需要任何的配置,所以直接将内容设置为“{}”即可。

在Project2的project.json文件中,我们在其commands配置项中定义了一个命令,其实这个命令是为K.cmd定义,我们可以直接利用后者执行这个命令。与执行第一个Hello World程序一样,我们开启CMD命令行工具。在通过CD命令将Project2设置为当前目录之后,我们按照如下的方式执行K RunFromProject3(RunFromProject3是在project.json中定义的命l令名称)。从控制台的输出可以确定我们的应用被正常启动了。

设置自定义的入口程序体现应用本身与应用托管之间的分离,它使我们可以创建独立于托管环境的应用,并根据需要寄宿于任何一个我们希望的宿主程序下,对于Web应用来说这一点尤为重要。对于之前的Web应用来说,IIS是它们唯一的宿主,但是ASP.NET 5应用却可以将我们指定的入口程序作为宿主。如果将应用寄宿于我们指定的宿主程序,这样的寄宿方式被称为Self-Host,接下来我们将通过一个具体的例子来演示如何定义一个简单的ASP.NET MVC应用,并采用Self-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应用是如何运行的(2)的更多相关文章

  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. PHP中关于PDO的使用

    执行没有结果集的查询 执行INSERT,UPDATE,DELETE的时候,不返回结果集.这个时候可以是有exec(),exec()将返回查询所影响的行数 int PDO::exec ( string ...

  2. 【ORACLE】IN 后跟&参数字符串的处理方法

    今天写尼日利亚BOSS,数据修复脚本时遇到一个问题, 参数字符串无法再IN中使用,例如:想要完成下面的查询 select * From customeren c where c.customercod ...

  3. jquery 获取奇数索引的元素

    $(".btn-xs:odd").click(function(){ var $buy_num=$(this).prev("#buy_num").val(); ...

  4. Cloud Engine:大杀器如何炼成

    郑昀(微博:http://weibo.com/yunzheng) 创建于2016/6/18 最后更新于2016/6/19 点击查看我的<如何从零搭建一个技术平台>,这是一个系列.转载时请注 ...

  5. HTML5 WebSocket

    在WebSocket API中,浏览器和服务器只需要做一个握手动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就可以直接进行数据传送,这一个功能可以应用到"字幕",自己做 ...

  6. AngularJS中的route可以控制页面元素的改变,使多页面变成一个单页面。。。

    SPA(Single Page Application)指的是通单一页面展示所有功能,通过Ajax动态获取数据然后进行实时渲染,结合CSS3动画模仿原生App交互,然后再进行打包(使用工具把Web应用 ...

  7. 安卓图标IconFont使用

    一.补充知识:PNG.IconFont.SVG理论 PNG为位图,是由不同的排列和染色的像素点组成的图像,位图的扩大实质是增加单个像素点的大小,故而导致在不同分辨率表现非常糟糕. SVG为可缩放矢量图 ...

  8. SQL Server 2012安装图文教程

    解析SQL Server 2012安装中心 当系统打开"SQL Server安装中心",则说明我们可以开始正常的安装SQL Server 2012了. SQL Server安装中心 ...

  9. Java学习笔记1

    学习一个Coursera的Data-structures-optimizing-performance. Working with String in Java Flesh score Flesh s ...

  10. The Solution of UESTC 2016 Summer Training #1 Div.2 Problem B

    Link http://acm.hust.edu.cn/vjudge/contest/121539#problem/B Description standard input/output Althou ...