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

问题描述

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

我正在尝试使用Kernel32.dll中的GetTickCount64(),因为这应该给我我想要的东西。

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

$Kernel32 = Add-Type -MemberDeFinition $MethodDeFinition -Name 'Kernel32' -Namespace 'Win32' -Passthru

$Kernel32::GetTickCount64()

不幸的是,运行此代码给我以下错误

警告:生成的类型未定义任何公共方法属性
方法调用失败,因为[Win32.Kernel32]不包含名为“ GetTickCount64”的方法

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

为什么找不到此方法

解决方法

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

轻松,简单地明确提供public访问修饰符即可解决:

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

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

,

将方法标记为公开,这应该可以工作

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

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

$Kernel32::GetTickCount64()

输出

4059006625