如何在 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
属性位于上方时,我发现这些导入签名更容易阅读,没有功能差异)
我正在尝试以滴答为单位获取系统的正常运行时间。我想专门使用 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
属性位于上方时,我发现这些导入签名更容易阅读,没有功能差异)