天天看点

通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)

Project2     Startup.cs     project.json Project3     Program.cs

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

1

2

3

4

5

6

7

8

9

10

11

12

<code>using</code> <code>System;</code>

<code>namespace</code> <code>Project2</code>

<code>{</code>

<code>    </code><code>public</code> <code>class</code> <code>Startup</code>

<code>    </code><code>{</code>

<code>        </code><code>public</code> <code>void</code> <code>Configure()</code>

<code>        </code><code>{</code>

<code>            </code><code>Console.WriteLine(</code><code>"Hello World!"</code><code>);</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>}</code>

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

我们说过任何一个被KRuntime视为项目的目录必须包含一个project.json文件,所以我们需要在Project2目录下创建这个一个文本文件,我们指定的入口程序就定义在这个文件之中。如下所示的是这个project.json文件的内容,我们仅仅在其commands配置项中添加了一个名为“RunFromProject3”的命令,对应的值为“Project3

Startup

Configure”,其中Project3代表包含入口程序的程序集(项目Project3被编译后生成的程序集)名称,Startup和Configure组成的字符串数组将作为程序入口方法(Main)的参数,它们分别表示应用启动程序所在的类型和对应的方法。我们同时在dependencies这个配置项中添加了针对Project3的项目依赖,这相当于在当前项目中添加了一个对应的项目引用。

<code>   </code><code>commands:{</code>

<code>      </code><code>"RunFromProject3"</code><code>:</code><code>"Project3 Startup Configure"</code>

<code>   </code><code>},</code>

<code>   </code><code>dependencies:{</code>

<code>       </code><code>"Project3"</code><code>:</code><code>""</code>

<code>  </code><code>}</code>

接下来我们在Project3目录下添加一个文本文件并将其命名为Program.cs,然后安装如下的形式定义这个作为程序入口的Program类型。与上面演示的第一个Hello

World应用一样,作为程序入口的类型必须命名为Program,其中包含一个静态或者实例Main方法。如上面的代码片断所示,Main方法的目的在于解析定义在Project2的Startup类型,然后据此类型实例化一个对应的对象并调用其Configure方法。类型和方法的名称来源于Main方法的参数,而类型解析采用的程序集名称与当前目录(%CD%)名称一致。

13

14

15

16

17

18

19

20

21

22

23

<code>using System;</code>

<code>using System.IO;</code>

<code>using System.Reflection;</code>

<code>using System.Linq;</code>

<code>namespace Project3</code>

<code>    </code><code>public</code><code>class</code> <code>Program</code>

<code>        </code><code>public void Main(string[] args)</code>

<code>            </code><code>string startup           = args[0];</code>

<code>            </code><code>string configure         = args[1];</code>

<code>            </code><code>string appBase           = Directory.GetCurrentDirectory();</code>

<code>            </code><code>string appName           = appBase.Substring(appBase.LastIndexOf(</code><code>'\\'</code><code>) + 1);</code>

<code>            </code><code>Type startupType = Assembly.Load(</code><code>new</code> <code>AssemblyName(appName))</code>

<code>                   </code><code>.GetTypes().FirstOrDefault(type =&gt; type.Name == startup);</code>

<code>            </code><code>startupType.GetMethod(configure)</code>

<code>                </code><code>.Invoke(Activator.CreateInstance(startupType),</code><code>new</code> <code>object[] { });</code>

通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)

在完成对作为入口程序的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

<a href="http://www.cnblogs.com/artech/p/asp-net-5-hello-world-01.html">通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)</a>

<a href="http://www.cnblogs.com/artech/p/asp-net-5-hello-world-02.html">通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)</a>

<a href="http://www.cnblogs.com/artech/p/asp-net-5-hello-world-03.html">通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(3)</a>

作者:蒋金楠

微信公众账号:大内老A

如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

<a href="http://www.cnblogs.com/artech/p/asp-net-5-hello-world-02.html" target="_blank">原文链接</a>