2011-05-05 17 views
8

Estoy tratando de obtener el tamaño actual de la memoria caché del archivo del sistema como se muestra a continuación. Sin embargo, cuando ejecuto este código no se devuelve nada, ¿alguien puede ver dónde me estoy equivocando? FYI el enlace es GetSystemFileCache.C# obtener el tamaño de la memoria caché del archivo del sistema

[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); 
    } 
+4

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). –

+0

¿Has intentado llamar a GetLastWin32Error para obtener el error? –

+0

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

Respuesta

5
 bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags); 

     Console.WriteLine(lpMinimumFileCacheSize); 
     Console.WriteLine(lpMaximumFileCacheSize); 

funciona bien para mí.

Salida:

1048576 
2143289344 

Windows 7 Pro x32

+0

a) ¿Qué números (aprox)? yb) 32 | 64 bits OS? –

+0

OK, obtuve 0 0 en Win7 x64. Y b == falso –

+0

@Henk, tengo x64 gana 7, más adelante probaré tu fragmento en él. –

2

Este fragmento de código funciona: (Windows Seven x86) enter image description here

2

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

Cuestiones relacionadas