如何在WinRT 8.1上调用kernel32.dll



我正在尝试使用一种本机API方法(GetNativeSystemInfo),该方法被标记为Windows 8.1上的手机和桌面应用商店应用程序都支持。在文档中,它被列为生活在kernel32.dll中。太棒了!所以我在P/Invoke上的第一次尝试看起来是这样的:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSysInfo);

不幸的是,这无法在实际设备上运行-找不到kernel32!碰巧,kernelBase.dll,因此我的第二次尝试是

[DllImport("kernelBase.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSysInfo);

虽然这在我的手机上运行良好,但它会导致应用程序无法通过认证;方法名称和"kernelBase.dll"似乎没有被列入白名单。

这是WACK的疏忽,还是导致此API在Store应用程序中不可用的错误?我的目标是获得有关正在运行的处理器(体系结构、类型等)的信息,我不想为了这么简单的事情而去C++。如果这个API在实践中不可用,有没有其他方法可以获得这些信息?

对于Windows Phone和Windows应用商店版本,您需要不同的pinvoke签名。有关电话参考,请参阅api-ms-win-core-sysinfo-l1-2-0.dll 中的GetNativeSystemInfo

#if WINDOWS_PHONE_APP
     [DllImport("api-ms-win-core-sysinfo-l1-2-0.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
     private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSysInfo);
#else
     [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
     private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSysInfo);
#endif

有关列表(针对SL,但也适用于运行时应用程序),请参阅Windows Phone 8支持的Win32 API。如果您以本机方式调用函数,那么正确的引用将被自动引用,但对于pinvoke,工具并不能做到这一点。通常,将函数封装在本机Windows运行时组件中比p-invoke更容易,除非您只有几个简单的p-invokes。

最新更新