2017 年 8 月 14 日更新:这个问题现在应该在商店中得到解决。如果您遇到此问题,请尝试重新提交您的应用程序。
这是 WACK 扫描在 Store 中运行的方式以及它如何与 .NET Native 集成的问题。
对于某些背景,Windows 实际上没有命名的 API FindFirstFileEx
- 它不存在。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"/>
请注意, 和 有很多条目FindFirstFileExA
,FindFirstFileExW
它们是实际存在的 API。每当您的应用程序尝试调用FindFirstFileEx
时,它实际上是在调用其中之一。
对于 C/C++ 开发者来说,预处理器实际上是根据宏FindFirstFileEx
的存在替换为A
orW
版本。UNICODE
对于 .NET 开发人员,JIT 运行时(或者,在 .NET Native 的情况下,编译器)根据属性的具体细节(例如和属性的值)确定是否调用A
或版本。W
DllImport
CharSet
ExactSpelling
这就是问题所在——目前,在编译器用正确的后缀版本替换非后缀版本之前,商店中的 WACK 正在.NET 程序集上运行。当您在开发机器上运行 WACK 时,它会在编译器进行替换后正确检查程序集,因此您看不到任何错误。
修复的第一部分(正在进行中)是将非后缀版本添加到允许列表中。修复的第二部分是确保 WACK 在后编译位上运行。