您所要做的就是像这样更改您的声明:
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize",
SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess,
long dwMinimumWorkingSetSize, long dwMaximumWorkingSetSize);
原因是因为函数的定义SetProcessWorkingSetSize
:
BOOL WINAPI SetProcessWorkingSetSize(
_In_ HANDLE hProcess,
_In_ SIZE_T dwMinimumWorkingSetSize,
_In_ SIZE_T dwMaximumWorkingSetSize
);
请注意,它不使用 a DWORD
(作为 32 位整数),而是使用 a SIZE_T
,其定义为:
指针可以指向的最大字节数。用于必须跨越指针整个范围的计数。此类型在 BaseTsd.h 中声明如下:
typedef ULONG_PTR SIZE_T;
这意味着它是一个 64 位值,因此可以更改为 along
并使函数在 64 位系统上工作。此外,来自 MSDN 的标题为“常见 Visual C++ 64 位迁移问题”的部分:
size_t、time_t和ptrdiff_t是 64 位 Windows 操作系统上的 64 位值。
但是,这有点进退两难,因为您不想编译特定于平台的程序集(那将是一个 PITA)。您可以通过利用类上的EntryPoint
字段(您已经在做)拥有两个方法声明来解决这个问题:DllImportAttribute
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize",
SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize32(IntPtr pProcess,
int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize",
SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize64(IntPtr pProcess,
long dwMinimumWorkingSetSize, long dwMaximumWorkingSetSize);
现在你有两个独立的签名。但是,知道调用哪个签名仍然是一个问题。您不想到处放置条件检查。为此,我建议创建一个为您执行检查并调用它的方法。
您将希望使用类上的Is64BitProcess
属性来做出此决定。不要使用该属性。您需要前者,因为 32 位进程可以在 64 位操作系统上运行,并且您希望确保您的代码对此具有弹性;仅检查操作系统是否为 64 位并不能为您提供完整的图片。Environment
Is64BitOperatingSystem