zoukankan      html  css  js  c++  java
  • C# 关于X86/X64/AnyCpu 的关系

    电脑硬件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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
    listview去掉底部多出的边框黑色
    使用fragmenttabhost后,子fragment怎么获取ID?怎么用getSharedPreferences
    android用shape给linearLayout设置边框,怎样只保留底部或顶部的边框,把其它三个方向的边框去掉呢?
    linux删除文件未释放空间问题处理
    mount: unknown filesystem type 'LVM2_member'解决方案【转】
    centos系统lvm的安装
    一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户
    php SimpleXML
    new JSONObject(str)无法解析 报错:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  • 原文地址:https://www.cnblogs.com/chaoshenzhu/p/10762918.html
Copyright © 2011-2022 走看看