我有兴趣了解是否有任何类型的 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
退出时",但在线程服务器示例中可能更复杂- 或者可以从内部或外部过早终止