C# 可执行控制台应用程序的生命周期(如果有)是什么



我有兴趣了解是否有任何类型的 C# 控制台应用程序的生命周期,类似于 ASP.Net 生命周期。

我特别感兴趣的是

  • 程序集决议 - 何时发生
  • 编译 - static Main 方法如何影响依赖对象的编译

通常,每个方法在首次执行时都会进行 JITted,并根据需要再次进行程序集解析,这通常意味着"在使用我们尚不需要的程序集的方法的 JIT 期间"(但也可以表示:通过反射)。

static Main的工作方式与任何其他方法相同;您在Main中使用的任何内容都将在Main开始执行之前得到解决。在某些情况下,您可能需要(帮助调试):

static int Main(string[] args) {
    try {
        return MainImpl(args);
    } catch(Exception ex) {
        // .. do something
        return -1;
    }
}
[MethodImpl(MethodImplOptions.NoInlining)]
static int MainImpl(string[] args) { ... }

如果通常Main(但现在为MainImpl)的代码导致程序集解析错误,这将非常有用...因为如果不能首先成功 JITed,Main就无法catch Main某些东西。

至于生命周期...

  • 入口点已启动 ( Main
  • 没有非后台线程处于活动状态时,应用程序退出;对于典型的线性控制台 exe,这意味着"当Main退出时",但在线程服务器示例中可能更复杂
    • 或者可以从内部或外部过早终止

相关内容

最新更新