【问题标题】:How to P/Invoke into kernel32.dll on WinRT 8.1如何在 WinRT 8.1 上 P/Invoke 到 kernel32.dll
【发布时间】:2015-04-12 09:45:15
【问题描述】:

我正在尝试使用一种本机 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 在应用商店应用中无法使用的错误?我的目标是获取有关正在运行的处理器的信息(体系结构、类型等),而且我不想为了这么简单的事情而使用 C++。如果此 API 在实践中不可用,是否有其他方法可以获取此信息?

【问题讨论】:

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


    【解决方案1】:

    Windows Phone 和 Windows Store 版本需要不同的 pinvoke 签名。手机参考 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-invoke。

    【讨论】:

    • 谢谢!我永远不会自己尝试这个。我以前看过这个页面,但没有理会它,因为它明确声明它仅适用于 Phone 8 和 Phone 8.1 Silverlight。有人应该更新它!
    猜你喜欢
    • 2011-12-10
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2010-10-08
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多