执行是如何从 clr 传递到 Startup class (startup.cs) 的?

How is execution passed from the clr to Startup class (startup.cs)?

asp.net 5 中的 Startup class 让我觉得很奇怪。它不是 class Startup : ISomething 或 Startup : BaseSomething,其中接口或基础 class 是某些 Microsoft.AspNet.* 程序集的一部分。 No Startup 只是一个普通的 class,带有按惯例创建的正确的神奇方法签名。

执行如何从 DNX 传递到 Startup.ConfigureServices?

让我们以调用为例:

dnx.exe . web

所以.告诉 dnx 它可以在当前文件夹中找到 project.json。从那里可以找到与键 "web" 关联的命令。所以如果本地 project.json 有这个:

"commands": {
"web" : Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
}

我要试一试,结合起来相当于: dnx.exe。 Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"

我还了解了 dnx 如何使用 project.json 中的参数收集所有源(包括依赖项)以进行内存编译,因此我们现在拥有用户程序集 "MyAssembly" 和所有可用的依赖程序集dnx。 dnx 已加载 Microsoft.AspNet.Hosting 作为托管入口点。因此执行从非托管 "stub" 传递到 Microsoft.AspNet。托管托管程序集。到目前为止正确吗?

下一个参数指示 Microsoft.AspNet.Hosting 它将托管 Microsoft.AspNet.Server.WebListener 的实例(特别是在本地主机的端口 500 上)。好的,那么 Microsoft.AspNet.Server.WebListener "know" 如何在 "MyAssembly" 中寻找一个特别命名为 "Startup" 的 class。它只是硬编码到 Microsoft.AspNet.Server.WebListener 中吗?进入 Microsoft.AspNet.Hosting?

到 Startup class 的跳转似乎是最后一个 "magic"。之前和之后的执行开始变得非常清楚,但我觉得我仍然缺少一些东西。

DNX 知道如何加载和执行 class 名为 Program 的程序集,其中有一个名为 Main 的方法。当您 运行 web 命令时,您正在将 Microsoft.AspNet.Hosting 作为启动程序集传递给 DNX。

托管有 Main method.

This code that eventually gets called from the Main method mentioned above has "Startup" hardcoded in it. The actual hardcode is here.

我想对 Victor 的回答添加一些细节:

我从 the DNX native host up to request handling 写了一系列帖子,深入探讨引导 ASP.NET 5 应用程序的细节。所有这些执行细节都包含在帖子中。