あなたがしなければならないのは、次のように宣言を変更することです。
[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
);
DWORD
(32ビット整数として)を使用するのSIZE_T
ではなく、 :として定義されることに注意してください。
ポインタが指すことができる最大バイト数。ポインタの全範囲にまたがる必要があるカウントに使用します。このタイプは、BaseTsd.hで次のように宣言されています。
typedef ULONG_PTR SIZE_T;
これは、64ビット値であることを意味します。したがって、に変更して、long
64ビットシステムで関数を機能させることができます。また、MSDNの「一般的なVisual C ++64ビット移行の問題」というタイトルのセクションから:
size_t、time_t、およびptrdiff_tは、64ビットWindowsオペレーティングシステムでは64ビット値です。
ただし、これには、プラットフォーム固有のアセンブリ(PITA)をコンパイルする必要がないという点で、少しジレンマがあります。これを回避するには、クラスのEntryPoint
フィールド(既に実行している)を利用して、次の2つのメソッド宣言を作成します。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);
これで、2つの別々の署名ができました。ただし、どの署名を呼び出すかを知ることは依然として問題です。どこにでも条件付きチェックを配置したくありません。そのためには、チェックを実行して呼び出すメソッドを作成することをお勧めします。
この決定を行うには、クラスのIs64BitProcess
プロパティを使用する必要があります。プロパティを使用しないでください。32ビットプロセスは64ビットオペレーティングシステムで実行できるため、前者が必要です。また、コードがそれに対応していることを確認する必要があります。オペレーティングシステムが64ビットであるかどうかを確認するだけでは、全体像はわかりません。Environment
Is64BitOperatingSystem