Nul*_*Dev 11 clr loader corflags
我想我的问题是关于CLR Loader.我想了解CorFlags.exe /32BIT+
功能背后的机制.
我们知道当一个人开始使用在64位Windows上设置的Any CPU标志编译的程序集时,它将以64位进程启动.如果CorFlags /32BIT+
在该程序集上运行,它将以32位进程启动.我认为这是一个引人入胜的特征.
我有很多问题:
是否有文章,书籍,博客等解释了此功能的内部工作原理?
在我所知道的任何地方都没有详细记录,我只能向您指出相关的MSDN文章.是的,您的假设是正确的,Windows XP及更高版本中的加载程序具有托管可执行文件的意识.它自动加载.NET加载程序填充程序(c:\ windows\system32\mscoree.dll),相关入口点为_CorValidateImage().链接的MSDN文章中的"备注"部分描述了将32位.exe文件转换为64位进程的机制:
在Windows XP和更高版本中,操作系统加载程序通过检查公共对象文件格式(COFF)标头中的COM描述符目录位来检查托管模块.设置位表示受管模块.如果加载程序检测到托管模块,则会加载MsCorEE.dll并调用_CorValidateImage,后者执行以下操作:
- 确认映像是有效的托管模块.
- 将图像中的入口点更改为公共语言运行库(CLR)中的入口点.
- 对于64位版本的Windows,通过将其从PE32转换为PE32 +格式来修改内存中的映像.
- 加载托管模块映像时返回加载程序.
对于可执行映像,操作系统加载程序然后调用_CorExeMain函数,而不管可执行文件中指定的入口点.对于DLL程序集图像,加载程序调用_CorDllMain函数.
_CorExeMain或_CorDllMain执行以下操作:
- 初始化CLR.
- 从程序集的CLR标头中找到托管入口点.
- 开始执行.
卸载托管模块映像时,加载程序调用_CorImageUnloading函数.但是,此功能不执行任何操作; 它只是回来了.