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

时间:2015-02-11 20:49:17

标签: c# windows-runtime windows-store-apps windows-phone-8.1 pinvoke

我尝试使用在Windows 8.1上标记为支持手机和桌面应用商店应用的原生API方法(GetNativeSystemInfo)。在文档中,它被列为生活在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无法使用的错误?我的目标是获取有关正在运行的处理器(架构,类型等)的信息,并且我不想为了这么简单的事情而使用C ++。如果此API在实践中不可用,是否有其他方法可以获取此信息?

1 个答案:

答案 0 :(得分: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

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