我尝试使用在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在实践中不可用,是否有其他方法可以获取此信息?
答案 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调用。