编写一个windows form 程序,在运行的时候需要根据不同的模式动态加载不同的dll。所以在运行的时候需要判断当前是以64模式运行还是以32位模式运行,注意:运行的模式和操作系统的关系,当前系统是64位系统 但是程序并不一定是以64位模式运行,也可能在编译的时候选择输出32位模式。前提条件: framework4.0  以下我的判断方式

var plate = Environment.Is64BitOperatingSystem ? "x64" : "x86";
            Console.WriteLine(plate);

当我们在VS中选择输出的目标平台是x86时就发现有问题了。上面代码只是判断了操作系统是64bit还是32bit,并不能反应当前运行的程序的状态。正确的方式也很简单,在程序中我们可以根据int长度来判断,简单又方便,如下代码:

var plate = IntPtr.Size == 8? "x64" : "x86";
 Console.WriteLine(plate);

特此记录!

三种判断方式对照

判断"当前进程位数"和"操作系统位数"是两回事,64 位系统上完全可以跑 32 位进程,选错 API 就会误判。

  • 操作系统位数:Environment.Is64BitOperatingSystem;
  • 当前进程位数:Environment.Is64BitProcess(.NET 4 及以上直接提供);
  • 通用技巧:IntPtr.Size 等于 8 即 x64 进程、等于 4 即 x86 进程,跨早期框架也适用;
  • AnyCPU + "首选 32 位"是默认坑:程序在 64 位系统上仍是 32 位进程,P/Invoke 原生 DLL 时位别必须和进程一致;
  • 动态加载原生 DLL 时务必按进程位数(而非系统位数)选择目录。