Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当用户单击.NET程序集(EXE)时会发生什么情况?_C#_.net - Fatal编程技术网

C# 当用户单击.NET程序集(EXE)时会发生什么情况?

C# 当用户单击.NET程序集(EXE)时会发生什么情况?,c#,.net,C#,.net,假设我们有.NET Winforms应用程序或控制台应用程序。 有谁能告诉我在WinForm或Console应用程序启动之前会发生什么。我想知道内部结构-比如EXE将如何与框架通信,CLR的作用是什么,在启动应用程序本身时发生异常时会发生什么。等等。您可能需要类似的内容:Microsoft.NET内部结构 或者因为它还没有发布:Essential.NET,第一卷:公共语言运行库 双击.net.exe程序集时: Windows的PE加载程序启动 如果您使用的是Windows>=Windows

假设我们有.NET Winforms应用程序或控制台应用程序。
有谁能告诉我在WinForm或Console应用程序启动之前会发生什么。我想知道内部结构-比如EXE将如何与框架通信,CLR的作用是什么,在启动应用程序本身时发生异常时会发生什么。等等。

您可能需要类似的内容:Microsoft.NET内部结构

或者因为它还没有发布:Essential.NET,第一卷:公共语言运行库


双击.net.exe程序集时:

  • Windows的PE加载程序启动
  • 如果您使用的是Windows>=Windows XP,它将检测到该可执行文件是托管可执行文件,并通过调用mscoree.dll中的_coreexmain将其转发到.net(如果双击托管.dll,则为_CoreDllMain)。它可以使用程序集配置文件来知道要使用哪个运行时
  • 如果您使用的是Windows
  • 然后,mscoree.dll根据全局配置、程序集配置文件等初始化.net运行时
  • 然后,如果它是.exe,它将JIT编译其入口点方法,并开始执行它
MSCoreEE.dll(MSCore Execution Engine.dll一台机器只有一个实例) 例如,当双击或启动.Net程序集/.exe时,操作系统将加载windows加载程序,该加载程序将加载PE头(可移植可执行文件)[对于win32可执行文件,PE头将包含引导程序的地址(static Main())它将从那里加载并执行main方法,在.Net中,引导程序将包含MSCoreEE.Dll的地址,该地址将出现在C:\Windows\System32\mscoree.Dll中,该地址将被执行并加载.Net程序集所针对的.Net运行时。machi上可以安装多个版本的.Net运行时但是,只有一个mscoreee.dll实例可以加载特定的运行时

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

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

作为stakoverflow的答案?有数百页长的相关书籍;)@TomTom-这不太公平!…这些是简略版本。1.下载Mono。2.编译。3.在调试器下启动。4.单步。5.重复步骤4。嗨,Sathish,你能要求更多信息,还是接受答案?这太好了。谢谢你的回答!谢谢你,ho。我会查这些书的