用户单击.NET程序集(EXE)时会发生什么?

考虑我们有.NET Winforms应用程序或控制台应用程序。 任何人都可以告诉我在WinForm或控制台应用程序启动之前会一步一步发生什么。 我想知道内部结构 – 比如EXE将如何与Framework通信,CLR的作用是什么,以及在启动应用程序本身时发生exception时会发生什么。等等…

双击.net .exe程序集时:

  • Windows的PE装载机开始运转
  • 如果您使用的是Windows> = Windows XP,它将检测到可执行文件是托管可执行文件,并通过调用mscoree.dll中的_CoreExeMain将其转发到.net(如果双击托管的.dll,则为_CoreDllMain)。 它可以使用程序集配置文件来了解要使用的运行时。
  • 如果您使用的是Windows
  • 然后mscoree.dll初始化.net运行时,具体取决于全局配置,程序集配置文件,以及不是。
  • 然后,如果它是.exe,它将JIT编译其入口点方法,并开始执行它。

MSCoreEE.dll(MSCore Execution Engine.Dll只有一台机器的一个实例)例如,当双击或启动.Net程序集/ .exe时,操作系统将加载将加载PE头的Windows加载程序(Portable可执行的)[在win32可执行文件的情况下,PE头将包含引导程序的地址(静态Main()),它将从中加载并执行main方法,在.Net中,引导程序将包含MSCoreEE的地址.Dll将出现在C:\ Windows \ System32 \ mscoree.dll中,它将被执行并加载.net程序集所针对的.Net运行时。 可以在计算机上安装多个版本的.Net运行时,但是,只有一个mscoreee.dll实例可以加载特定的运行时。

CLR将自己创建第一个APP域并加载程序集(如果程序集没有在代码中创建其他应用程序域)

CLR在内部创建3个应用程序域1.系统应用程序域a。 负责加载共享和默认应用程序域,还将mscorelib.dll加载到共享应用程序域b。 创建3个独立的exception实例i。 致命引擎exceptionii。 堆栈溢出exceptioniii。 内存不足exception(非常重要的是,当开发人员认为应用程序内存不足并希望将exception写入日志文件时,CLR会预先创建“内存不足”exceptionbcose,因此会产生内存不足exception没有内存来创建此exception的新实例,因此,CLR预先创建此exception以供将来在应用程序中使用2.共享应用程序域a。包含mscorlib.dll b。其他应用程序域使用的其他公共库c。但是,开发人员无法将自定义Dll推入共享应用程序域,因为它无法从CLR外部控制,CLR托管这些dll,而CLR本身无法控制开发人员如何托管它,但是可能使用某些COM接口开发人员可以托管CLR习惯3.默认应用程序域a。所有用户二进制文件.exe,Dll在这里加载