.Net编译环境x86,x64,anycpu的区别

时间:2024-03-08 17:29:21

一、定义

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