zoukankan      html  css  js  c++  java
  • .Net编译环境x86,x64,anycpu的区别

    一、定义

    x86: 将程序集编译为由兼容 x86 的 32 位公共语言运行库运行。
    x64: 将程序集编译为由支持 AMD64 或 EM64T 指令集的计算机上的 64 位公共语言运行库运行。
    anycpu:(默认值)将程序集编译为在任意平台上运行。
    Itanium: 将程序集编译为由采用 Itanium 处理器的计算机上的 64 位公共语言运行库运行。

    二、选择不同后的行为

    在 64 位 Windows 操作系统上:
    用 x86 编译的程序集将在 WOW64 下运行的 32 位 CLR 上执行。
    用 x64 编译的程序集将在 64 位 CLR 上执行。
    用 anycpu 编译的可执行文件将在 64 位 CLR 上执行。
    用 anycpu 编译的 DLL 将在与加载它的进程相同的 CLR 上执行。
     
    在 32 位 Windows 操作系统上:
    用 x86或anycpu 编译的程序集将在 32 位 CLR 上执行。
    用 x64 编译的程序集无法运行。

    三、AnyCPU(Prefer 32-bit)(看了waterlv,大水哥的博文)

    这是在右击属性,选择首选32位才会使用的方法,必须使用 .net framework 4.5 以上才可以使用。在这个编译下,程序运行都是 32 位。

    在 32 位系统下,运行 32 位程序

    在 64 位系统下,运行 32 位程序,但是可以获得 4G 内存

    在 ARM 下,运行 32 位程序

    如果使用 AnyCPU 那么编译为 IL 是不需要加平台,程序在机器运行才判断机器平台,自动编译为机器可以运行的程序。

    那么 AnyCPU(Prefer 32-bit) 和 x86 有什么区别?实际上在 ARM 系统,只能使用 AnyCPU(Prefer 32-bit) 运行 32 位程序,如果选择 x86 就无法运行。

    为什么需要在 64 位的设备使用 AnyCPU(Prefer 32-bit),因为如果存在一些库只能在 32位程序运行,那么就需要运行的程序是 32 位,所以需要使用这个方法。

    如果在运行的时候,如何判断当前的系统版本?

    可以使用 Environment 来判断,Environment.Is64BitProcess 可以判断当前的程序运行的是 32 还是 64 ,通过 Environment.Is64BitOperatingSystem 可以判断系统

    那么如何判断一个 dll 是 x86 还是 any cpu?

    可以打开开发者命令,然后输入 corflags 判断,开发者命令一般如果是安装 vs2017 就是Developer Command Prompt for VS 2017,通过开始就可以找到。

    corflags lindexi.dll

    看输出,就可以知道这个库是什么

    Any CPU:

    PE: PE32 32BIT: 0

    x86:

    PE: PE32 32BIT: 1

    x64:

    PE: PE32+ 32BIT: 0

    四、其他编译选择

    • anycpu 默认的编译
    • anycpu32bitpreferred 在 .NET Framework 4.5 和以上才可以使用
    • ARM 程序编译为 ARM 运行
    • x64
    • x86
    • Itanium

    如果使用命令编译,那么可以使用platform和字符串

    csc /platform:anycpu filename.cs  
  • 相关阅读:
    layui穿梭框内容溢出解决办法
    location之alias浅析
    Semaphore和SemaphoreSlim实现并发同步
    Barrier实现并发同步
    CountdownEvent实现并发同步
    AutoResetEvent实现并发同步
    TrieTree树
    EncryptByPassPhrase与DecryptByPassPhrase的浅说
    一个mp4转gif的网站
    vue轮播图(可随父元素高宽自适应)
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/11599117.html
Copyright © 2011-2022 走看看