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

时间:2010-05-07 11:48:15

标签: c# .net

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

3 个答案:

答案 0 :(得分:13)

双击.net .exe程序集时:

  • Windows的PE加载程序启动
  • 如果您使用的是Windows> = Windows XP,它将检测到可执行文件是托管可执行文件,并通过调用mscoree.dll中的_CoreExeMain将其转发到.net(如果您双击托管的.dll,则为_CoreDllMain )。它可以使用程序集配置文件来了解要使用的运行时。
  • 如果您使用的是Windows<在Windows XP中,.exe文件包含一小段原生代码,它将跳转到mscoree.dll的_CoreExeMain或_CoreDllMain。
  • 然后mscoree.dll初始化.net运行时,具体取决于全局配置,程序集配置文件以及不支持的内容。
  • 然后,如果它是.exe,它将JIT编译其入口点方法,并开始执行它。

答案 1 :(得分:1)

MSCoreEE.dll(MSCore Execution Engine.Dll只有一台机器的一个实例) 例如,当双击或启动.Net程序集/ .exe时,操作系统将加载Windows加载程序,这将加载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加载到共享应用程序域 湾创建3个独立的异常实例 一世。致命引擎异常 II。堆栈溢出异常 III。内存不足异常(非常重要的是,当开发人员认为应用程序内存不足并希望将异常写入日志文件时,CLR会预先创建“内存不足”异常bcose,因此会产生内存不足异常没有内存来创建此异常的新实例,因此,CLR会预先创建此异常以供将来在应用程序中使用 2.共享应用程序域 一个。包含mscorlib.dll 湾其他应用程序域使用的其他公共库 C。但是,开发人员无法将自定义Dll推入共享应用程序域,因为它无法从CLR外部控制,CLR托管这些dll,而CLR本身无法控制开发人员如何托管它,但是可能使用某些COM接口开发人员可以按惯例托管CLR的地方 3.默认App域 一个。所有用户二进制文件都是.exe,Dll在这里加载

答案 2 :(得分:0)