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位地址空间运行。

windows程序生成目标平台与CLR运行执行过程的更多相关文章

  1. CLRMonitor - 跟踪CLR内部执行过程工具

    CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软 ...

  2. yarn平台的任务调度和执行过程

  3. .NET CLR 运行原理

    原文: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects 文章讨论了: SystemDoma ...

  4. 四、Struts2的执行过程和原理

    执行过程和原理(可能面试题) 学习目标:熟知struts2的执行过程(下图记住).源码可以不看 a.过滤器的初始化 .StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有 ...

  5. [转]C#程序无法在64位系统上运行之.NET编译的目标平台

    今天将编译的C#的exe拷贝到测试机上(Win7_64bit),一运行就挂了,提示“stop working”,一开始怀疑测试机上没有安装.net framework框架,追究半天原来是编译的目标平台 ...

  6. Android系统移植(一)-让android系统在目标平台上运行起来

    编号),文件系统采用ubifs格式,控制台设备为ttyS1,波特率为115200 启动的第一个应用程序是/init (6)确保控制台的设置和硬件保持一致,如:硬件上串口用的是UART1,则内核启动参数 ...

  7. Windows 10 IoT Serials 8 – 如何改变UWP应用的目标平台

    Windows Insider计划直接加速了Windows系统的迭代,缩短了系统发布的周期.就Windows 10 IoT Core而言,迭代的速度和Windows 10 for PC.Windows ...

  8. .NET编译的目标平台(AnyCPU,x86,x64)

    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...

  9. 关于.NET编译的目标平台(AnyCPU,x86,x64)

    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...

随机推荐

  1. _DataStructure_C_Impl:LinkListBasedSort

    #include<stdio.h> #include<stdlib.h> #include"LinkList.h" //创建单链表 void CreateL ...

  2. 绿色便携版Lazarus的制作教程

    本文来源: www.fpccn.com 原作者:逍遥派掌门人 http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452791.aspx 本教 ...

  3. Struts2 全局结果集

    1.index,jsp <body> Result类型 <ol> <li><a href="user/user?type=1">返回 ...

  4. 10.MongoDB:将Json数据直接写入MongoDB的方法

    Json转Bson MongoDB中是以Bson数据格式进行存储的,Json字符串没有办法直接写入MongoDB 可以将Json字符串转换成DBObject或者Document,然后写入MongoDB ...

  5. SP1026 FAVDICE - Favorite Dice 数学期望

    题目描述: 一个n面的骰子,求期望掷几次能使得每一面都被掷到. 题解:先谈一下期望DP. 一般地,如果终止状态固定,我们都会选择逆序计算. 很多题目如果顺序计算会出现有分母为 0 的情况,而逆序计算中 ...

  6. linux下pptp配置步骤

    最近买了个VPS,于是随手搭了个VPN玩,ubuntu安装pptp太蠢了,直接apt-install pptp就行了 1./etc/pptpd.conf 注销最后两行,就是设置IP转发的范围,给那么几 ...

  7. df---显示磁盘分区使用空间

    df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法 df(选项)(参数) 选项 -a或--all:包含全部的文 ...

  8. MFC- OnIdle空闲处理

    CWinApp::OnIdlevirtual BOOL OnIdle( LONG lCount );返回值: 如果要接收更多的空闲处理时间,则返回非零值:如果不需要更多的空闲时间则返回0.参数: lC ...

  9. 【Henu ACM Round#14 F】 President and Roads

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...

  10. vs平台 error link:2019

    需要XXX.lib或XXX.dll库.手动添加,项目->属性->配置属性->链接器->输入 然后在附件依赖项添加XXX.lib,再生成第一个无法解析的外部符号错误消失了.