我想我的问题是关于CLR http://en.wikipedia.org/wiki/Common_Language_Runtime装载机。我想了解背后的机制CorFlags.exe http://msdn.microsoft.com/en-us/library/ms164699%28v=vs.80%29.aspx /32BIT+
功能。
我们知道,当一个人启动一个用Any CPU在 64 位 Windows 上设置标志,它作为 64 位进程启动。如果一跑CorFlags /32BIT+
在该程序集上,它将作为 32 位进程启动。我认为这是一个令人着迷的功能。
我对此有很多疑问:
- 它是如何实施的?
- 操作系统加载程序是否参与其中?
- 是否可以构建一个根据需要加载 32 位或 64 位 CLR 的自定义应用程序(我猜是非托管应用程序)?
是否有文章、书籍、博客等解释此功能的内部工作原理?
据我所知,这在任何地方都没有详细记录,我只能向您指出相关的 MSDN 文章。是的,您的假设是正确的,Windows XP 及更高版本中的加载程序可以识别托管可执行文件。它会自动加载.NET加载程序垫片(c:\windows\system32\mscoree.dll),相关入口点是_CorValidateImage() http://msdn.microsoft.com/en-us/library/4ce9k7xb%28v=vs.90%29.aspx。链接的 MSDN 文章中的“备注”部分描述了将 32 位 .exe 文件转换为 64 位进程的机制:
在 Windows XP 及更高版本中,操作系统加载程序通过检查通用对象文件格式 (COFF) 标头中的 COM 描述符目录位来检查托管模块。设置位表示受管模块。如果加载程序检测到托管模块,它将加载 MsCorEE.dll 并调用 _CorValidateImage,后者执行以下操作:
- 确认映像是有效的托管模块。
- 将映像中的入口点更改为公共语言运行时 (CLR) 中的入口点。
- 对于 64 位版本的 Windows,通过将内存中的映像从 PE32 转换为 PE32+ 格式来修改该映像。
- 加载托管模块映像后返回到加载程序。
对于可执行映像,操作系统加载程序然后调用
_CorExeMain 函数,无论可执行文件中指定的入口点如何。对于 DLL 程序集映像,加载程序调用 _CorDllMain
功能。
_CorExeMain 或 _CorDllMain 执行以下操作:
- 初始化 CLR。
- 从程序集的 CLR 标头中定位托管入口点。
- 开始执行。
加载器在托管模块时调用_CorImageUnloading函数
图像已卸载。然而,该函数不执行任何操作
行动;它只是返回。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)