加载公共语言运行库

       我们构建的每个程序集既可以是一个可执行应用程序,也可以是一个dll。当然,最终由CLR来管理这些程序集中的代码的执行。这意味着必须在主机上安装好.net framework。要想知道是否已经安装.net framework,可以检查%systemroot%system32目录下的MSCorEE.Dll文件,若存在该文件,表明.net framework已经安装。

      如果程序集文件中只包含类型安全的托管代码,那么无论在32位版本的windows上,还是64位版本的windows上,所写的代码都应该能够正常工作。在这两种版本的windows上运行,源代码无需进行任何改动。事实上,编译器最终生成的exe/dll文件不仅能在32位windows上运行,还能在64位windows的x64和IA64版本上运行。也就是说,只要机器上安装了.net framework的某个版本,文件就能在这台机器上运行。
      在极少数的情况下,开发人员编写的代码需要在一个特定版本的windows上运行。例如,假如要使用不安全代码,或者要和针对特定cpu构架的非托管代码进行互操作,就可能遇到这种情况。
      运行一个可执行文件时,windows会检查这个exe文件的头,判断应用程序需要的是32位地址空间,还是64位地址空间。具有pe32头的文件可以在32位或64位地址空间中运行,具有pe32+头的文件则要求一个64位地址空间。windows还要检查头中嵌入的cpu构架信息,确保它和cpu类型相匹配。
      在windows检查exe文件头,判断是创建32位进程,64位进程,还是wow64进程之后,windows在进程的地址空间中加载MSCorEE.Dll的x86,x64或者IA64版本。然后,进程的主线程调用MSCorEE.DLL内部定义的一个方法。这个方法初始化CLR,加载EXE程序集,然后调用其入口方法(Main)。随即,被托管的应用程序将启动并运行。
      如果一个非托管应用程序调用LoadLibrary来加载一个托管的程序集,windows会知道加载并初始化CLR来处理包含在程序集中的代码。当然,这种情况下,进程已经启动并运行,而且这可能会限制程序集的可用性。例如,用32位开关编译的程序集没办法加载到一个64位的进程中。
原文地址:https://www.cnblogs.com/chenzhou851025/p/1238438.html