Debido al problema que estamos encontrando en relación con MS KB 976618 y debido a Al no querer ejecutar código binario de terceros desconocidos en los servidores de producción, me fuerzan al lenguaje C#. Como soy un novato en C# me tomó un tiempo, pero finalmente descubrí los bits extra alrededor de los fragmentos de código que la gente ha estado publicando. Así que mi ms completo programa de consola de Visual Studio C# que compila y se ejecuta es:
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool GetSystemFileCacheSize(
ref IntPtr lpMinimumFileCacheSize,
ref IntPtr lpMaximumFileCacheSize,
ref IntPtr lpFlags
);
static void Main(string[] args)
{
IntPtr lpMinimumFileCacheSize = IntPtr.Zero;
IntPtr lpMaximumFileCacheSize = IntPtr.Zero;
IntPtr lpFlags = IntPtr.Zero;
bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags);
Console.WriteLine(b);
Console.WriteLine(lpMinimumFileCacheSize);
Console.WriteLine(lpMaximumFileCacheSize);
Console.WriteLine(lpFlags);
}
}
y en mi Windows 7 x64 PC emite
True
1048576
1099511627776
0
y no, ese no es nuestro servidor de producción.
y luego en powershell esto es
$source = @"
using System;
using System.Runtime.InteropServices;
namespace MyTools
{
public static class cache
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool GetSystemFileCacheSize(
ref IntPtr lpMinimumFileCacheSize,
ref IntPtr lpMaximumFileCacheSize,
ref IntPtr lpFlags
);
public static bool Get(ref IntPtr a, ref IntPtr c, ref IntPtr d)
{
IntPtr lpMinimumFileCacheSize = IntPtr.Zero;
IntPtr lpMaximumFileCacheSize = IntPtr.Zero;
IntPtr lpFlags = IntPtr.Zero;
bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags);
a = lpMinimumFileCacheSize;
c = lpMaximumFileCacheSize;
d = lpFlags;
return b;
}
}
}
"@
Add-Type -TypeDefinition $source -Language CSharp
# Init variables
$SFCMin = 0
$SFCMax = 0
$SFCFlags = 0
$b = [MyTools.cache]::Get([ref]$SFCMin, [ref]$SFCMax, [ref]$SFCFlags)
#typecast values so we can do some math with them
$SFCMin = [long]$SFCMin
$SFCMax = [long]$SFCMax
$SFCFlags = [long]$SFCFlags
write-output "Return values from GetSystemFileCacheSize are: "
write-output "Function Result : $b"
write-output " Min : $SFCMin"
write-output (" Max : $SFCMax (" + $SFCMax/1024/1024/1024 + " GiB)")
write-output " Flags : $SFCFlags"
Siguiente paso: SetSystemFileCacheSize, he escrito un script de PowerShell para esto y lo puso en https://serverfault.com/questions/325277/windows-server-2008-r2-metafile-ram-usage/527466#527466
Me sorprende que no es un ejemplo de http://pinvoke.net para esa función. (vaya al submenú Kernel32.dll). Si lo haces funcionar, agrega un ejemplo a ese sitio (es un wiki). –
¿Has intentado llamar a GetLastWin32Error para obtener el error? –
lo siento, soy una droga completa, tenía la plataforma de destino todavía establecida en X86. Me siento avergonzado ahora. Una vez configurado en cualquier CPU, funciona bien. – Johnv2020