问题描述
我正在尝试以分钟为单位获取系统的正常运行时间。我想专门使用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