windows程序生成目标平台与CLR运行执行过程

C# 编译器提供一个选项, 该选项允许指定最终生成的程序集只能运行在32位windows版本的X86机器上使用, 只能在运行64位windows的X64机器上使用, 或者只能在32为windows RT的ARM机器上使用。

PS: 不指定具体平台的话, 默认选项就是anycpu, 该选项指定程序集能在任何版本的windows上运行。

 

 

由于生成版本选项, C#编译器生成的程序既包含的要么是PE32头, 要么是PE32+头。

 

除此之外, 编译器还会在头中指定CPU架构(默认是anycpu 代表任意CPU架构)。

Microsoft发布的SDK命令行实用程序 DumpBin.exe 和CorFlags.exe, 可用它们检查编译器生成的托管模块所嵌入的信息。


Windows应用程序运行过程?

1.可执行文件运行时, Windows检查文件头, 判断需要是32位还是64位的地址空间。
PE32文件在32位或者64位地址空间均可运行,
PE32+文件则需要64位地址空间
PS: windows还会检查头中嵌入的CPU架构信息, 确保当前计算机的CPU符合要求。

2.Windows检查EXE文件头, 决定是创建32位还是64位进程之后, 会在进程地址空间加载MSCorEE.dll的x86,x64或ARM版本

如果是Windows的X86或ARM版本, MSCorEE.dll的X86版本在 %SystemRoot%\System32目录中。
如果是Windws的X64版本,MSCorEE.dll的X86版本在 %SystemRoot%\SysWow64 目录中。
64位版本则在 %SystemRoot%\System32目录中(为了向后兼容).

3.

然后进程的主线程调用MSCorEE.dll中定义的一个方法, 这个方法初始化CLR, 加载exe程序集,

再调用其入口方法(Main), 随即, 托管应用程序启动并且运行。

 

注: Environment的 Is64BitOperatingSystem 属性, 可判断是否在64位windows运行, Is64BitProcess属性可判断是否在64位地址空间运行。

 

转载于:https://www.cnblogs.com/zh7791/p/7845148.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值