由于不支持的API FindFirstFileEx(WACK在本地传递)导致UWP应用程序提交失败

jkh*_*jkh 9 xamarin windows-store-apps xamarin.forms uwp wack

我有一个UWP项目作为我的Xamarin.Forms解决方案的一部分.在本地运行Windows App Cert Kit时,它会毫无问题地通过.

将我的应用程序提交到商店时,它未通过认证过程,并出现以下错误:

发现错误:

支持的API测试检测到以下错误:

此应用程序类型不支持api-ms-win-core-file-l1-2-0.dll中的API FindFirstFileEx.PInvoke.Kernel32.dll调用此API.

如果没有修复影响:

使用不属于Windows SDK for Windows Store应用程序的API会违反Windows应用商店认证要求.

怎么修:

查看错误消息以识别不属于Windows SDK for Windows Store应用程序的API.请注意,在调试配置中构建的应用程序或未启用.NET Native的应用程序(如果适用)可能会使此测试失败,因为这些环境可能会引入不受支持的API.在发布配置中重新测试您的应用程序,并启用.NET Native(如果适用).

我已经验证我的应用在发布模式下运行,并验证了我的UWP构建设置:

UWP

我尝试联系微软的聊天支持,但被重定向进入事件报告,然后我被重定向到只是在论坛上寻求帮助或支付高级技术支持,所以我无法获得有关是否有任何更多信息这是一个有效的失败.

根据FindFirstFileEx(https://msdn.microsoft.com/en-us/library/windows/desktop/aa364419 ( v= vs.85 ) .aspx )上的文档,它看起来像Windows桌面支持,存储应用程序和Windows Phone.我的UWP应用程序被提交以支持桌面和移动系列,这些系列似乎包含在此功能的受支持客户端中,因此不清楚导致故障的原因.

关于从哪里去的任何想法?

Pet*_*SFT 6

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


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

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

  1. 它是由包中的另一个DLL导出的API
  2. 它是允许列表中明确提到的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"/> 
Run Code Online (Sandbox Code Playgroud)

请注意,有一些条目用于FindFirstFileExAFindFirstFileExW,它们是实际存在的API.每当您的应用尝试呼叫时FindFirstFileEx,它实际上会调用其中一个.

对于C/C++开发人员来说,预处理器实际上替代FindFirstFileExAW版本基于所述存在UNICODE.

对于.NET开发人员,JIT运行时(或者,在.NET Native的情况下,编译器)根据属性的细节(例如和属性的值)确定是否调用AW版本.DllImportCharSetExactSpelling

这就是问题所在 - 目前,在编译器用正确的后缀版本替换非后缀版本之前,Store中的WACK正在.NET程序集上运行.在开发计算机上运行WACK时,它会在编译器进行替换正确检查程序集,因此您看不到任何错误.

修复程序的第一部分(正在进行中)是将非后缀版本添加到allow-list中.修复的第二部分是确保WACK在后编译位上运行.