【问题标题】:How do managed applications run [closed]托管应用程序如何运行[关闭]
【发布时间】:2013-06-05 23:16:25
【问题描述】:

我正在学习.NET框架编程模型。

当托管 exe 运行时(因此其中没有机器代码),CLR(mscorlib.dll) 如何接管并进行 JIT 编译,或者谁调用了 CLR,或者它一直在运行?

【问题讨论】:

  • @series0ne - 我不认为这是一个完全的骗局。那篇文章没有解释操作系统如何将 .exe 识别为托管代码(即:如何扩展 PE 以包装 IL)。
  • @series0ne 嗨,谢谢你的评论。我知道 C# 是如何工作的?什么是 CLR,它有什么作用? C#代码转换成什么?但我的问题在您提供的链接中没有答案。
  • @ZoomIn,啊!我在这里想得太深入了。 - 由于J...的回答,即使我也学到了一些东西。 - 我很想知道这方面,Mono 是如何编译 .NET 应用程序的……它肯定不会使用相同的 PE 格式,因为这在传统上不是 Windows 域之外的已知可执行格式。
  • @series0ne Linux 使用 ELF(不是 PE),但我认为 Mono 不会生成任何包装器。据我所知,您必须像mono hello.exe(在命令行中)一样直接调用已编译的程序集。

标签: .net clr jit


【解决方案1】:

检查that question,它的链接问题也很好。

顺便说一下,mscorlib.dll 不是 CLR,它只包含基本的托管类型(参见 that question)。

【讨论】:

  • 很好的发现 - 将其标记为重复,因为这确实回答了所有问题。
【解决方案2】:

托管可执行文件仍包含标准的Portable Executable (link)* 标头,其中包含以下信息:

  • 它是什么类型的模块,
  • 模块创建时间戳,
  • CPU 架构 (32/64),
  • _CorExeMain()(或 _CorDLLMain())函数的入口点内存地址

在启动任何应用程序时,Windows 都会读取 PE 标头 - 对于 .NET 应用程序,标头将其标识为托管程序集,然后将执行转移到 CLR。​​


*参见:.NET、元数据和 PE 格式部分

【讨论】:

  • 嗨,谢谢你的回答,既然托管可执行文件没有机器代码,它怎么会有机器代码部分。
  • 这个答案不是很正确。它曾经用于旧版本,Windows 2000 及更早版本。但是 XP 及更高版本有一个加载程序,它知道如何直接识别托管程序,而不依赖于程序集中的 5 字节本机代码。他们具有加载程序存根 mscoree.dll 的内置知识。并自动加载它以引导托管代码。这也是调用相当大的魔法将 32 位 EXE 转换为 64 位进程的方式。
  • @HansPassant - 我没有意识到这一点。这是否意味着VS不再添加PE包装器? .net exe 文件是纯托管程序集吗?这会破坏与 Win2K 等的向后兼容性吗?
  • @HansPassant 那么>XP 中的加载程序如何知道哪些是托管可执行文件,哪些不是?
  • 我在任何地方都没有看到记录。但它肯定在 PE 标头中非常明显。就像 PE 包装器中的清单标头一样,您在使用 /clrheader 选项运行 dumpbin.exe 时看到的标头。或 _CorExeMain 或 _CorDllMain 链接依赖项。
猜你喜欢
  • 2012-11-21
  • 2013-02-28
  • 2010-09-23
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多