电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系统,不能够很充分的利用这台机器的资源。x86程序,即适用于32为操作系统的程序,x64即适用于64位操作系统的程序。64位系统上依然可以运行32位的程序,但是这是通过WOW64来运行,通俗上讲,就是模拟出一个32位的CPU来运行这个程序。

接下来是C#程序的编译运行,分为两步,第一步是编译成IL,在编写C#程序的时候,需要考虑到在最终程序需要在哪种环境下运行。Build中默认的环境是Any CPU,还有X86,X64. 这些有什么不同?根据名字,我们可能认为,编译器会根据选择的环境不同来生成不同的二进制文件。然而,C#编译器只是把代码编译成为了IL代码,以dll的形式。然后再程序运行的时候,JIT编译器才把IL代码编译为CPU能够识别的二进制码。所以,无论选择哪个环境,都不会影响dll的生成,只是在dll的头文件中加入了一些平台信息,最终运行的时候JIT会根据这些信息来编译dll给CPU处理。

x86编译的dll和x64编译的dll是不能相互引用的,否则会抛出程序集不能下载的异常。Any CPU编译的dll,被哪种类型的程序调用,就会编译成哪种类型的dll.现在考虑一种情况
A项目是Console Application, B项目是Class Library, 在64位操作系统的机器上。A项目为Start Project,决定了这个程序的32位还是64位的属性。如果A设置为x86, A决定了这个程序为32位,B设置为x86, 因为两个项目都是同一类型,虽然都是32位,但可以在64位系统上运行。如果A为Any CPU, B为x86,就会出问题。因为A虽然为Any CPU,但是在64位操作系统上运行,就会转换成64位的dll,A决定了这个程序为64位,然后再调用32位的dll,就会出问题。如果A为x86, B为Any CPU, 就不会出问题。 因为A决定了这个程序为32位,调用B的时候就会把B转成32位,一切正常。

有人说,难道不可以一直把Project设置为Any CPU吗?因为现在很多的系统都是64位的,所以我们的程序设置成Any CPU, 在64位机器上跑的时候就是64位的程序,但是这些程序很多时候需要使用一些组件,比如COM组件等,而这些组件仅仅是32位的dll,根本不支持64位,当我们用64位的程序调用这些dll的时候就会有问题。所以,这时候,我们就需要把我们的程序设置成x86.

那么有人说,那都设置为x86不就可以了?那么现在我们就要保证我们的程序引用的dll都是32位的。虽然很多第三方的dll都提供32位与64位两个版本,基本上可以保证这一点。但是如果没有必要做成32位的程序,单纯是为了方便,我们前边说过64位的系统运行32位的程序,效率不高,浪费了我们的资源。
---------------------
作者:孙大诚_SunRobin
来源:CSDN
原文:https://blog.csdn.net/sundacheng1989/article/details/18349503
版权声明:本文为博主原创文章,转载请附上博文链接!

C# 关于X86/X64/AnyCpu 的关系的更多相关文章

  1. 『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译

    背景: > System.Data.SQLite.dll 程序集 不能良好的支持 AngCPU 格式 System.Data.SQLite.dll 在 适应 x86 和 x64 有三个方案: & ...

  2. vs2010 编译平台 X86 X64 anycpu

    X86既32位程序,X64既64位程序,anycpu会根据当前的操作系统位数决定 但是如果应用程序编译成anycpu,会由操作系统位数决定,如果是dll之类的,会由调用dll的主程序位数决定 所以一般 ...

  3. x86/x64/AnyCPU之间的区别

    原文链接 http://blog.csdn.net/lordwish/article/details/52312015 x86操作系统 目标平台 程序类型 运行结果 x86 应用程序exe 在32位C ...

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

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

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

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

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

    关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . ...

  7. 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY

    转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...

  8. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  9. 关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别

    相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...

随机推荐

  1. 微信小程序之模板的使用

    初步学习小程序模板,就把过程写一下了. 1.在app.json里面注册temlate/public,生成模板wxml,wxss等系列页面 2.注册模板 <1>无数据传参的模板 <te ...

  2. YApi二次开发环境部署

    YApi 是去哪儿网大前端技术中心开源的一个可视化的接口管理平台.下面是在CentOS7下搭建二次开发环境步骤. 1 安装MongoDB 具体安装参考CentOS7安装MongoDB 2 安装Node ...

  3. java文件运行的过程

    javac .java——>编译成.class文件(字节码) 参考: https://www.cnblogs.com/yxwkf/p/3855363.html https://www.jians ...

  4. centos7使用kubeadm安装部署kubernetes 1.14

    应用背景: 截止目前为止,高热度的kubernetes版本已经发布至1.14,在此记录一下安装部署步骤和过程中的问题排查. 部署k8s一般两种方式:kubeadm(官方称目前已经GA,可以在生产环境使 ...

  5. http验证

    read -p "输入要添加的用户名: " USERNAME read -p "输入密码: " PASSWD printf "$USERNAME:$( ...

  6. hyper发送表单数据

    前言 某个美丽的下午,运维把服务器上的nginx升级了,http协议也变成了http2.0,我本地的requests再也连接不到服务器,然后就找到了额hyper 但是hyper的文档写的很简单,而且相 ...

  7. Flink的高可用集群环境

    Flink的高可用集群环境 Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能. 因现在主要Flink这一块做先关方面的学习, ...

  8. 2018-2019 20165232 Exp5 MSF基础应用

    2018-2019 20165232 Exp5 MSF基础应用 一.原理与实践说明 1.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个 ...

  9. Python:Mac 下 MQTT 服务器 Mosquitto 的配置

    我在Mac电脑上搭建时遇到了一些不同于网上大部分情况的问题,特此分享给可能也有遇到相同情况又找不到解决方法的人. 我的电脑系统:macOS Mojave 10.14.3. paho-mqtt 的安装 ...

  10. ASP.NET后台调用API方法

    /// <summary> /// 调用API POST请求与获取结果 /// </summary> ///URL 与 JSON串 public static string H ...