Todo lo que tiene que hacer es cambiar su declaración de este modo:
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize",
SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess,
long dwMinimumWorkingSetSize, long dwMaximumWorkingSetSize);
La razón se debe a la definition of the SetProcessWorkingSetSize
function:
BOOL WINAPI SetProcessWorkingSetSize(
_In_ HANDLE hProcess,
_In_ SIZE_T dwMinimumWorkingSetSize,
_In_ SIZE_T dwMaximumWorkingSetSize
);
Tenga en cuenta que no utiliza un (entero como de 32 bits) DWORD
sino un SIZE_T
, que is defined as:
El número máximo de bytes a los que puede apuntar un puntero. Úselo para un recuento de que debe abarcar todo el rango de un puntero. Este tipo se declaró en BaseTsd.h como sigue:
typedef ULONG_PTR SIZE_T;
Esto significa que es un valor de 64 bits, por lo tanto, la capacidad de cambiar a un long
y tienen la función de trabajo en sistemas de 64 bits. También, desde la sección de MSDN titulado "Common Visual C++ 64-bit Migration Issues":
size_t, time_t, y ptrdiff_t son valores de 64 bits en sistemas operativos Windows de 64 bits.
Sin embargo, esto presenta un poco de un dilema, en el sentido de que no desea tener que compilar ensambles específicos de la plataforma (que sería un PITA). Usted puede evitar esto mediante el aprovechamiento de la EntryPoint
field en el DllImportAttribute
class (que ya se está haciendo) para tener dos declaraciones de métodos:
[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);
Ahora usted tiene dos firmas independientes. Sin embargo, saber que firma para llamar sigue siendo un problema. No desea colocar controles condicionales en todas partes. Con ese fin, recomendaría crear un método que realice el control por usted y lo llame.
Querrá utilizar el Is64BitProcess
property en el Environment
class para tomar esta determinación. No use el Is64BitOperatingSystem
property. Desea lo primero porque los procesos de 32 bits se pueden ejecutar en sistemas operativos de 64 bits, y desea asegurarse de que su código sea resistente a eso; solo verificando si el sistema que opera es de 64 bits no le da la imagen completa.
¿Alguna razón por la que no utiliza la aplicación administrada? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.minworkingset(v=vs.110) – rene
En general, esta es una mala idea ya que el marco optimizará el tamaño del conjunto de trabajo. ¿Cuál es su requisito? – Maciej
@Maciej Hemos ejecutado 3 semanas de análisis de latencia profunda en el programa, y estamos viendo fallas de 250us en el programa debido a fallas de página de software. Estamos intentando aumentar el tamaño del conjunto de trabajo para reducir la cantidad de fallas de página suaves. – Contango