C#IntPtr和ProcessorAffinity - 如何超过32位?

时间:2016-01-21 19:07:21

标签: c# process 64-bit

我的计算机拥有超过31个cpu核心。我想在31日之后为cpu核心分配一个进程。我的问题是IntPtr在这台机器上解析为32位整数。它是一台运行64位操作系统的64位计算机。这似乎无视微软here

所述的内容
  

IntPtr类型设计为大小为的整数   特定于平台的。也就是说,期望这种类型的实例   32位硬件和操作系统上的32位,以及64位   64位硬件和操作系统。

以下是我构建IntPtr的方法:

public static IntPtr GetCpuBinaryValue(int cpuIndex)
{
    // The IntPtr type is designed to be an integer whose size is platform - specific.
    // That is, an instance of this type is expected to be 32 - bits on 32 - bit hardware and operating systems,
    // and 64 - bits on 64 - bit hardware and operating systems.


    IntPtr ptr = new IntPtr(Convert.ToInt64(Math.Pow(2, cpuIndex)));
    return ptr;
}

继续这个例子,下面是我设置ProcessorAffinity的方法:

using System.Diagnostics;
...
    // set which processor to run the process on
                process.ProcessorAffinity = GetCpuBinaryValue(coreIndex);
...

例如,我可以传入值“0”,它将返回一个掩码为00000000 00000000 00000000 00000001的IntPtr(32位)

如果我传入“31”,它将返回10000000 00000000 00000000 00000000

我希望将其转换为64位,例如,如果我传入值“32”,它将返回:00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

有没有办法解决这个问题?它固执地停留在32位上。

1 个答案:

答案 0 :(得分:1)

您可能正在x86Any CPU中投放。 IntPtr是特定于平台的,但它也取决于流程本身。如果进程以64位模式运行,则指针将为64位,如果进程以32位运行,则指针将为32位。

如果切换到显式运行x64(如How to: Configure Projects to Target Platforms中所述),则溢出异常消失,正确的值似乎存储在返回值中。