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

问题描述:

考虑我们有.NET Winforms应用程序或控制台应用程序。 任何人都可以告诉我什么将一步一步发生,直到WinForm或控制台应用程序启动。我想知道内部结构 - 比如EXE如何与Framework进行通信,CLR的作用是什么,在启动应用程序本身时会发生什么情况。例如:用户单击.NET程序集(EXE)时会发生什么?

+6

作为stakoverflow的答案?有几本书的书是关于这些的,长达数百页;) – TomTom 2010-05-07 11:51:36

+5

@TomTom - 这不太公平!......这些是删节版本。 – 2010-05-07 11:56:35

+2

1.下载单声道。 2.编译它。 3.在调试器下启动它。 4.单步。 5.重复第4步。 – 2010-05-07 11:58:22

当您双击点击一个.NET的.exe程序集:

  • Windows的PE加载器踢
  • 如果你是一个Windows> = Windows XP中,将检测到可执行文件是可执行的托管,将其转发给.net通过调用mscoree.dll中的_CoreExeMain(_CoreDllMain,如果你双击托管的.dll)。它可以使用程序集配置文件来知道使用哪个运行时。
  • 如果您使用的是Windows XP操作系统,请在Windows XP中,该.exe文件包含一小段原生代码,该代码将跳转到mscoree.dll的_CoreExeMain或_CoreDllMain。
  • 然后,mscoree.dll会初始化.net运行时,具体取决于全局配置,程序集配置文件以及哪些不。
  • 然后,如果它是一个.exe,它将JIT编译它的入口点方法,并开始执行它。
+0

这太棒了。感谢您的回答Jb Evain! – Sathish 2010-05-07 12:11:13

+0

谢谢你。我将通过书籍检查 – Sathish 2010-05-07 12:11:40

的MSCoreEE.dll(MSCore执行Engine.Dll实例只为一个一体机) 说,例如,当一个.net组件/ .EXE被双击或启动时,OS将加载窗器会inturn加载PE头文件(可移植可执行文件)[在win32可执行文件的情况下,PE头文件将包含引导程序(静态Main())的地址,它将载入并执行main方法,在.Net中,引导程序将包含将存在于C:\ Windows \ System32 \ mscoree.dll中的MSCoreEE.Dll地址,该地址将被执行并加载.net程序集针对的.Net运行时。机器上可以安装多个版本的.Net运行时,但是,只有一个mscoreee.dll实例可以加载特定的运行时。

CLR将创建第一APP域本身和加载组件(如果组件没有在代码中创建附加的应用程序域)

CLR创建3个应用程序域内部 1.系统的应用程序域 一个。 负责加载共享和默认应用程序域,还将mscorelib.dll加载到共享应用程序域 b。 创建3个异常例子 i。致命的发动机异常 ii。堆栈溢出异常 iii。内存不足异常(非常重要的一点是,当开发人员认为应用程序可能内存不足并想将异常写入日志文件时,CLR会预先创建“内存不足”异常,因此会发生内存不足异常没有剩余内存来创建此异常的新实例,因此,CLR预先创建此例外以备将来在应用程序中使用 2.共享应用程序域 a。包含mscorlib.dll b。其他应用程序域使用的其他常用库 c。但是,开发人员无法将自定义Dll推入共享应用程序域,因为它不能从CLR外部控制它,CLR托管这些dll并且CLR本身无法控制其由开发人员托管的方式,但可以使用某些COM接口开发人员可以托管CLR惯例 3.默认应用程序域 a。所有用户的二进制文件的.exe的,Dll在这里加载