0

我有一个针对 Windows-10 桌面和移动平台的 C# 应用程序。我的应用程序通过 c++/cx 绑定调用用 C++ 编写的 Windows 运行时组件。
我的 C++ 代码使用线程本地存储 API,例如TlsAllocTlsGetValueTlsSetValueTlsFree。当我运行 Windows 应用程序认证工具包测试(WACK 测试)时,它抱怨这些 api 在商店应用程序中不可用。

◦此应用程序类型不支持 kernel32.dll 中的 API TlsAlloc。sample.dll 调用此 API。
◦此应用程序类型不支持 kernel32.dll 中的 API TlsFree。sample.dll 调用此 API。
◦此应用程序类型不支持 kernel32.dll 中的 API TlsGetValue。sample.dll 调用此 API。
◦此应用程序类型不支持 kernel32.dll 中的 API TlsSetValue。sample.dll 调用此 API。

我看不到这些用于 Windows-10 商店应用程序的 api 的替代品。此MSDN 页面 仅讨论这些 api 在Windows Phone 8上的可用性。我找不到有关这些用于Windows-10的 api 的任何具体信息

我正在使用-DWINAPI_FAMILY=WINAPI_FAMILY_APP标志编译我的本机 C++ 库

任何建议将不胜感激

4

2 回答 2

0

对于 Windows 10 Phone UWP 应用,文档似乎有误。如果您链接到 kernel32.lib,您可以使用 Tls* 函数,但是当您尝试部署它时,它会因缺少 DLL 错误而失败。

相反,如果您要链接到使用 TLS 的现有代码,则可以使用以下仿真(将其放在代码中的任何位置):

extern "C" {
DWORD WINAPI __imp_TlsAlloc() {
    return FlsAlloc(nullptr);
}
BOOL WINAPI __imp_TlsFree(DWORD index) {
    return FlsFree(index);
}
BOOL WINAPI __imp_TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) {
    return FlsSetValue(dwTlsIndex, lpTlsValue);
}
LPVOID WINAPI __imp_TlsGetValue(DWORD dwTlsIndex) {
    return FlsGetValue(dwTlsIndex);
}
}
于 2017-03-04T22:53:03.373 回答
0

@HansPassant 的回答有助于解决这个问题。

UWP Windows-10 应用商店应用程序支持线程本地存储 (TLS) api。
我必须升级到 Windows SDK 版本10.0.14393.33
在此之前的任何版本都会在 TLS api 上出错

于 2016-08-18T00:58:06.587 回答