三、加载公共语言运行时

二、源代码=>程序集及程序集概念介绍中介绍了源代码通过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应用程序。

posted @ 2018-01-15 16:30  郑小超  阅读(757)  评论(0编辑  收藏  举报