三、加载公共语言运行时
二、源代码=>程序集及程序集概念介绍中介绍了源代码通过C#编译器生成程序集(或者可执行应用程序exe)的整个过程,本文主要介绍公共语言运行时与程序集的关系.
1、通过C#编译器编译之后生成的每个程序集既可以是可执行程序(exe),也可以使dll(其中含有一组由可执行应用程序使用的类型),最终都由CLR来管理执行这些程序集中的代码.这就意味者如果目标机器要想执行程序集,就必须安装.Net Framework.大多数windows在发售时就已经安装了.Net Framework.
2、win10下校验.Net Framework环境
(1)、判断是否安装
C:\Windows\SysWOW64在当前路径下判断是否有下图中的dll文件
如果有,说明Net Framework已安装
(2)、win10检测所有安装的.Net Framework版本,以及相关的进程Id
打开cmd,定位到clrver.exe文件的路径,执行clrver -all指令
win10下操作如下:
可以去任务管理器中校验结果.
3、windows32位版本和64位版本对编译器生成的托管模块的影响以及对CLR运行时的影响
(1)、问题
众所周知,windows包含32位和64位两个版本,所以相同的程序集代码在这两个环境下的会有差异.分析如下:
相同点:如果程序集文件中只包含类型安全的代码,那么代码在32位环境下和64位环境的windows中都能正常工作.源代码不需要任何改动.(只要安装了.Net Framework,且代码的类型安全,那么编译器生成EXE/DLL能同时在32位和64位下的windows中运行)
不同点:如果你的项目中包含了类型不安全的代码,比如面向特定CPU架构的非托管代码进行相互操作,这个时候常规的做法可能无法满足这个要求.
(2)、解决方案 -使用/platform命令行开关
为了帮助那些在程序集代码中需要操作不安全代码的开发人员,C#编译器提供了一个/platform命令行开关选项.这个开关选项允许指定最终生成的程序集只能在运行32位版本的windows下x86机器、只能在运行64位windows的64位的x64机器上运行、或者只能在运行32位的Windows RT的ARM机器上使用.如果不指定平台的话,默认就是anycpu,表明最终生成的程序集能在任何版本的windows上运行.
(3)、Visual Stdio中设置目标平台的方式
右键项目-属性-生成
(4)、项目指定目标平台后,编译器的工作方式
项目指定目标平台后,C#编译器生成的程序集会按照目标平台的配置生成相应的PE头、要么是PE32头,要么是PE32+头,除此之外,还会在头中指定要求什么CPU架构(如果是anycpu,则代表任意cpu)
(5)、win10下使用MS提供的SDK命令行实用程序DumpBin.exe和CorFlags.exe来检查编译器所生辰的托管模块的嵌入信息
CorFlags.exe
打开cmd
DumpBin.exe
(6)、项目指定目标平台后,windows执行通过编译器生成的可执行文件的方式
windows检查文件头,判断需要32位地址空间还是64位地址空间,PE32文件在32位或64位地址空间均可运行,PE32+文件则需要64位空间地址,windows还会查头中嵌入的CPU信息,确保当前计算机的CPU符合要求
注:windows的64位版本可以通过Wow64(Windows on Windows64)技术运行32位Windows应用程序。