c # получить размер системного кеша - PullRequest
8 голосов
/ 05 мая 2011

Я пытаюсь получить текущий размер кэша системного файла, как показано ниже.Однако, когда я запускаю этот код, ничего не возвращается, кто-нибудь может увидеть, где я иду не так?К вашему сведению ссылка GetSystemFileCache .

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

Ответы [ 3 ]

5 голосов
/ 05 мая 2011
        bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags);

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

У меня отлично работает.

Выход:

1048576
2143289344

Windows 7 Pro x32

2 голосов
/ 26 июля 2013

Из-за проблемы, с которой мы сталкиваемся в связи с MS KB 976618 и из-за нежелания запускать двоичный код от неизвестных сторонних производителей на производственных серверах, я вынужден перейти на язык c #. Потому что я новичок в c #, это заняло у меня некоторое время, но я наконец-то понял, какие дополнительные кусочки вокруг фрагментов кода, которые публикуют люди. Итак, моя полная консольная программа ms Visual Studio C #, которая компилируется и запускается:

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);
    }
}

и на моем компьютере с Windows 7 x64 выводит

True
1048576
1099511627776
0

и нет, это не наш производственный сервер.

а затем в powershell это

$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"

Следующий шаг: SetSystemFileCacheSize. Я написал для этого сценарий powershell и включил его https://serverfault.com/questions/325277/windows-server-2008-r2-metafile-ram-usage/527466#527466

2 голосов
/ 05 мая 2011

Этот фрагмент кода работает: (Windows Seven x86) enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...