如何在WinRT 8.1上调用/调用kernel32.dll

Ben*_*Ben 5 c# pinvoke windows-runtime windows-store-apps windows-phone-8.1

我正在尝试使用本机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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是对WACK的监督,还是导致此API在商店应用中无法使用的错误?我的目标是获取有关正在运行的处理器(架构,类型等)的信息,我不想为了这么简单的事情而使用C++.如果此API在实践中不可用,是否有其他方法可以获取此信息?

Rob*_*SFT 11

您需要Windows Phone和Windows Store版本的不同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
Run Code Online (Sandbox Code Playgroud)

请参阅支持的Windows Phone 8 Win32 API以获取列表(针对SL,但也适用于您的Runtime应用程序).如果您本机调用该函数,则会自动引用正确的引用,但pinvoke不会使用该工具.通常,在本机Windows运行时组件中包装函数比p调用更容易,除非您只有一些简单的p调用.