对于上面创建的这个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. HDU 2222  AC自动机模板题

    1.HDU 2222 2.题意:给出n个单词,一个字串,求有多少个单词在字串里出现了.注意给出的单词可能会重复,重复的不计. 3.总结:入门题.在查询这里还是不太懂. #include<bits ...

  2. hadoop---前期准备---屌丝

    hadoop要求有多台机子进行后续的数据处理,作为屌丝一枚,怎么才能搭建一个合适的环境学习hadoop?这就是本篇将要介绍的----前期准备. 搭建环境没啥好说的,说一下搭建环境多需要的吧 硬件:电脑 ...

  3. ajax的一些笔试面试题

    1. 什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript and XML”的缩写.他是指一种创建交互式网页 ...

  4. 不用css3的响应式img(按比例缩小图片)

    有时候自己为了控制图片的响应式,按比例缩小放大图片,如果解决这个问题,用js吧,很麻烦.也会损失很大的加载运行速度等:所以我们还是用css来解决这个问题,用css来强制按比例压缩图片的高度或宽度,看代 ...

  5. [ios]新手笔记-。-UIPickerView 关于伪造循环效果和延时滚动效果

    查找了网上资料,循环效果绝大部分都是增加行数来制造循环的错觉,延时滚动就是利用NSTimer间隔出发滚动事件来制造滚动效果. 代码: #import <UIKit/UIKit.h>#imp ...

  6. Odoo 二次开发教程(二)-模块的基础构建

    注:本篇及后续均以8.0为基础. 一. Odoo模块的构成 __init__.py 文件是python包导入所必须的文件,内容可以为空,通常情况下我们用来导入自己写的py文件. __openerp__ ...

  7. java并发编程(十四)同步问题的内存可见性

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另 ...

  8. 发布一个自用的ansi转utf8程序

    前几天网上下载了一个国外的源码示例,布署到IIS上,查看网页中文显示乱码,各种不方便,你懂的. 用记事本打开文件,显示是ANSI格式,另存为UTF8格式,保存,再查看页面就正常显示中文了. 文件好多, ...

  9. International Conference for Smart Health 2015 Call for Papers

    Advancing Informatics for healthcare and healthcare applications has become an international researc ...

  10. Expert 诊断优化系列------------------内存不够用么?

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...