如何在 Windows 10 上使用 PowerShell 从 Kernel32.dll 调用 GetTickCount64()

How to call GetTickCount64() from Kernel32.dll using PowerShell on Windows 10

我正在尝试以滴答为单位获取系统的正常运行时间。我想专门使用 64 位方法来避免在 32 位版本下发生的回绕。我知道还有其他查看正常运行时间的方法,但我没有使用这些方法,因为它们会给我的实施带来其他问题。

我正在尝试使用 Kernel32.dll 中的 GetTickCount64(),因为这应该可以满足我的需求。

$MethodDefinition = @"
[DllImport("kernel32")] extern static UInt64 GetTickCount64();
"@

$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru

$Kernel32::GetTickCount64()

不幸的是运行这段代码给我以下错误:

WARNING: The generated type defines no public methods or properties.
Method invocation failed because [Win32.Kernel32] does not contain a method named 'GetTickCount64'.

我不明白为什么这在Windows 10 上不起作用,此方法从 Vista 开始可用。

为什么这个方法定位不到?

将方法标记为 public,这应该有效

$MethodDefinition = @"
[DllImport("kernel32")] public static extern UInt64 GetTickCount64();
"@

$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru

$Kernel32::GetTickCount64()

输出

4059006625

如果您在 C# 方法签名中省略显式访问修饰符,它 defaults to private,意味着您将无法通过 $Kernel32::GetTickCount64() 调用该方法,因此会出现警告。

修复它很容易,只需显式提供 public 访问修饰符即可:

$MethodDefinition = @"
[DllImport("kernel32")]
public extern static UInt64 GetTickCount64();
"@

(当 DllImport 属性位于上方时,我发现这些导入签名更容易阅读,没有功能差异)