如何在 WinRT 8.1 上 P/Invoke 变成 kernel32.dll

How to P/Invoke into kernel32.dll on WinRT 8.1

我正在尝试使用本机 API 方法 (GetNativeSystemInfo),该方法被标记为支持 phone 和 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);

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

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

Windows Phone 和 Windows Store 版本需要不同的 pinvoke 签名。对于 phone 参考 GetNativeSystemInfo 来自 api-ms-win-core-sysinfo-l1-2-0.dll

#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

请参阅 Supported Win32 APIs for Windows Phone 8 以获取列表(针对 SL,但也适用于您的运行时应用程序)。如果您本机调用该函数,将自动引用正确的引用,但没有工具可以为 pinvoke 这样做。一般来说,将函数包装在原生 Windows 运行时组件中比 p-invoke 更容易,除非你只有几个简单的 p-invokes。