我的Xamarin.Forms解决方案中包含一个UWP项目。在本地运行Windows App Cert Kit时,它顺利通过而没有任何问题。

将我的应用提交到商店时,它通过以下错误导致认证过程失败:



我已验证我的应用程序在“发布”模式下运行,并且已验证我的UWPbuild设置:

xamarin - 由于不支持的API FindFirstFileEx,UWP应用提交失败(WACK在本地传递)-LMLPHP

我尝试联系Microsoft的聊天支持,但被重定向到输入事件报告,然后我被重定向到只是在论坛上寻求帮助或支付高级技术支持,因此我无法获得有关是否这是否是有效的失败。

根据FindFirstFileEx(https://msdn.microsoft.com/en-us/library/windows/desktop/aa364419(v=vs.85).aspx)上的文档,Windows桌面,商店应用程序和Windows Phone似乎都支持它。我的UWP应用已提交,以支持桌面和移动系列,而该系列似乎已包含在此功能的受支持客户端中,因此尚不清楚是什么原因导致了该故障。

关于从这里出发的任何想法?

最佳答案

更新2017年8月14日:现在应该在商店中解决此问题。如果遇到此问题,请尝试重新提交您的应用程序。

这是WACK扫描在商店中运行的方式以及如何与.NET Native集成的问题。

对于某些背景,Windows实际上没有名为FindFirstFileEx的API-它不存在。 WACK支持的API扫描的工作方式是查看您调用的所有API并验证以下条件之一是否成立:

  • 这是包
  • 中另一个DLL导出的API
  • 这是在允许列表
  • 中明确提到的API

    对于kernel32.dll!FindFirstFileEx,WACK会发现软件包中不存在kernel32.dll,因此必须检查允许列表。允许列表没有提及FindFirstFileEx,因为它不存在。这是存在的:
    C:\Program Files (x86)\Windows Kits\10\App Certification Kit>findstr FindFirstFileEx SupportedAPIs-x64.xml
        <API Name="FindFirstFileExA" ModuleName="api-ms-win-core-file-l1-1-0.dll"/>
        <API Name="FindFirstFileExA" ModuleName="api-ms-win-core-file-l1-2-0.dll"/>
        <API Name="FindFirstFileExA" ModuleName="api-ms-win-core-file-l1-2-1.dll"/>
        <API Name="FindFirstFileExA" ModuleName="api-ms-win-core-file-l1-2-2.dll"/>
        <API Name="FindFirstFileExA" ModuleName="api-ms-win-downlevel-kernel32-l1-1-0.dll"/>
        <API Name="FindFirstFileExW" ModuleName="api-ms-win-core-file-l1-1-0.dll"/>
        <API Name="FindFirstFileExW" ModuleName="api-ms-win-core-file-l1-2-0.dll"/>
        <API Name="FindFirstFileExW" ModuleName="api-ms-win-core-file-l1-2-1.dll"/>
        <API Name="FindFirstFileExW" ModuleName="api-ms-win-core-file-l1-2-2.dll"/>
        <API Name="FindFirstFileExW" ModuleName="api-ms-win-downlevel-kernel32-l1-1-0.dll"/>
        <API Name="FindFirstFileExA" ModuleName="kernel32.dll"/>
        <API Name="FindFirstFileExW" ModuleName="kernel32.dll"/>
    

    请注意,有一堆FindFirstFileExAFindFirstFileExW条目,它们是实际存在的API。每当您的应用尝试调用FindFirstFileEx时,它实际上是在调用其中之一。

    对于C/C++开发人员,预处理器实际上将FindFirstFileEx替换为AW版本based on the existence of the UNICODE macro

    对于.NET开发人员,JIT运行时(或在.NET Native情况下为编译器)会根据 A attribute的详细信息(例如WDllImport属性的值)确定是调用CharSet还是ExactSpelling版本。

    问题就在这里-目前,商店中的WACK正在.NET程序集上运行,而之前,编译器已用正确的后缀版本替换了未后缀的版本。在开发计算机上运行WACK时,它会在
    之后正确地检查汇编程序,编译器已进行替换,因此您不会看到任何错误。

    修复程序的第一部分(正在进行中)是将非后缀版本添加到允许列表中。修复程序的第二部分是确保WACK在后编译位上运行。

    关于xamarin - 由于不支持的API FindFirstFileEx,UWP应用提交失败(WACK在本地传递),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45288395/

    10-13 04:57