Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#获取系统文件缓存大小_C#_Pinvoke - Fatal编程技术网

c#获取系统文件缓存大小

c#获取系统文件缓存大小,c#,pinvoke,C#,Pinvoke,我正在尝试获取当前系统文件缓存大小,如下所示。然而,当我运行这段代码时,什么也没有返回,有人能看到我哪里出错了吗? 仅供参考,链接为 对我来说很好 输出: 1048576 2143289344 Windows 7 Pro x32此代码段有效:(Windows 7 x86) 由于我们遇到的问题与生产服务器相关,并且由于不想在生产服务器上运行来自未知第三方的二进制代码,我被迫使用c语言。因为我是c#的新手,花了我一段时间,但我最终发现了人们发布的代码片段周围的额外部分。因此,我编译并运行的完整ms

我正在尝试获取当前系统文件缓存大小,如下所示。然而,当我运行这段代码时,什么也没有返回,有人能看到我哪里出错了吗? 仅供参考,链接为

对我来说很好

输出:

1048576
2143289344
Windows 7 Pro x32

此代码段有效:(Windows 7 x86)
由于我们遇到的问题与生产服务器相关,并且由于不想在生产服务器上运行来自未知第三方的二进制代码,我被迫使用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 PC上,它输出

True 1048576 1099511627776 0
下一步:SetSystemFileCacheSize,我已经为此编写了一个powershell脚本,并将其放在

上,我很惊讶没有该函数的示例。(转到Kernel32.dll子菜单)。如果你让它工作,请添加一个例子到该网站(这是一个维基)。你有没有尝试调用GetLastWin32Error后获得错误?对不起,我是一个完全的傻瓜,我的目标平台仍然设置为X86。我现在感到惭愧。一旦设置为任何CPU,它就可以正常工作。@Mike-谢谢你的建议,我不知道那个网站。现在增加了示例a)什么数字(近似值)?b)32 | 64位操作系统?好的,我在Win7 x64上得到了0。b==false@Henk,我有x64 win 7,稍后我会在上面尝试你的代码片段。亨克-你需要将目标更改为任何CPU或x64,然后工作正常
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);
    }
}
True 1048576 1099511627776 0
$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"