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"