我的计算机拥有超过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位上。
答案 0 :(得分:1)
您可能正在x86
或Any CPU
中投放。 IntPtr
是特定于平台的,但它也取决于流程本身。如果进程以64位模式运行,则指针将为64位,如果进程以32位运行,则指针将为32位。
如果切换到显式运行x64
(如How to: Configure Projects to Target Platforms中所述),则溢出异常消失,正确的值似乎存储在返回值中。