Я пытаюсь создать приложение UWP. Мне нужно включить в приложение ряд существующих (неуправляемый код) библиотек C++. Насколько я понимаю, лучший способ сделать это - обернуть все это в компонент среды выполнения Windows.
После некоторых трудностей мне удалось собрать приложение, связав его со всем существующим кодом C++ через компонент среды выполнения Windows. Некоторые из этих библиотек зависят от предварительно скомпилированных библиотек Win32 .dll. Поэтому я также перекомпилировал их из исходного кода с помощью Visual Studio 2015 для архитектуры ARM.
При развертывании на платформе Windows Mobile я получаю следующее исключение:
'System.IO.FileNotFoundException' in System.Private.Interop.dll; Unhandled exception at 0x77A3DF95 (combase.dll)
Это не очень помогает. Но на основе этого вопроса SO: i">System.IO.FileNotFoundException: не удалось загрузить файл или сборку "X" или одну из ее зависимостей при развертывании приложения, моя гипотеза заключается в том, что, несмотря на сборку DLL для ARM, одна из них все еще имеет зависимость куда-то в dll Win32, который, как и ожидалось, не может быть найден (отсюда FileNotFoundException).
Когда я загружаю каждую из DLL, созданных для ARM, в Dependency Walker, я не Я не вижу никаких зависимостей от Win32, за исключением одной из DLL, которую я создал для ARM из исходного кода, icuuc56.dll, которая, как я вижу, имеет kernel32 (advapi32) в качестве зависимости. Насколько я понимаю, Windows Mobile не будет предоставлять эти зависимости от ОС (отсюда FileNotFoundException?). И что динамическая загрузка этой конкретной зависимости Win32 вызывает сбой приложения.
Я хочу собрать версию icuuc56.dll для ARM без привязки к библиотекам Win32. По крайней мере, так я могу определить, какие части ICU4C полагаются на вызовы функций Win32. Но, как ни странно, при сборке для ARM я не могу запретить компоновщику связываться с %(AdditionalDependencies), который включает библиотеки Win32.
Я правильно интерпретировал проблему? Если да, то мои вопросы:
Почему ICU4C в первую очередь нацелен на сборку ARM, если он зависит от DLL Win32?
Как я могу предотвратить связывание с Kernel32 во время сборки, чтобы я мог определить, какие части ICU4C вызывают вызовы функций, которые не могут быть выполнены на ARM.
Существует ли аналог ICU4C, предоставляемый ОС, который можно использовать вместо этого в UWP?
ОБНОВЛЕНИЕ: когда #ifdef WIN32
принимает значение true, platform.h ICU4C устанавливает следующее
#define U_PLATFORM_USES_ONLY_WIN32_API 1
#define U_PLATFORM_HAS_WIN32_API 1
Если я попытаюсь возиться с определениями препроцессора платформы, лучшее, что я могу получить, это использовать, например, tzset вместо _tzset. Которого тоже не будет (я полагаю).
Можно ли как-нибудь собрать ICU4C для UWP, не переписывая его полностью? В конце концов, его можно скомпилировать для iOS и Android. Я более подробно рассмотрю https://sourceforge.net/p/icu/mailman/icu-support/thread/[email protected]/, но это, похоже, немного другая проблема.