我有一个针对Windows-10桌面的C#应用程序;移动平台。我的应用程序调用了用C++编写的带有C++/cx绑定的Windows运行时组件。
我的C++代码使用线程本地存储api,如TlsAlloc、>TlsGetValue[/strong>、TlsSetValue和Tls自由。当我运行Windows应用程序认证工具包测试(WACK测试(时,它会抱怨商店应用程序中的这些api不可用。
◦此应用程序不支持kernel32.dll中的API TlsAlloc类型sample.dll调用此API
◦kernel32.dll中的API TlsFree不是此应用程序类型支持。sample.dll调用此API
◦API此应用程序不支持kernel32.dll中的TlsGetValue类型sample.dll调用此API
◦kernel32.dll中的API TlsSetValue为此应用程序类型不支持。sample.dll调用此API。
我看不到Windows-10商店应用程序的这些api的替代品。此MSDN页面仅讨论这些api在WindowsPhone8上的可用性。我找不到任何关于Windows-10的这些api的具体信息
我正在使用-DINAPI_FAMILY=WINAPI_FAMILY_APP标志编译我的本机C++库
任何建议都将受到高度赞赏
@HansPassant的回答帮助解决了这个问题。
UWP Windows-10 Store应用程序支持线程本地存储(TLS(api。
我不得不升级到Windows SDK版本10.0.14393.33
在此之前的任何版本都会在TLS api的上出错
对于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);
}
}