我正在尝试构建一个UWP应用。我需要在应用程序中包含许多现有(非托管代码)C ++库。我对最佳方法的理解是将所有这些包装在Windows运行时组件中。
经过一些困难之后,我设法获得了一个应用程序来构建,通过Windows运行时组件链接到所有现有的C ++代码。其中一些库依赖于预编译的Win32 .dll。因此,我还使用Visual Studio 2015从ARM体系结构中重新编译了这些内容。
在Windows移动平台上部署时,我遇到以下异常:
'System.IO.FileNotFoundException' in System.Private.Interop.dll; Unhandled exception at 0x77A3DF95 (combase.dll)
这无济于事。但基于这个SO问题:System.IO.FileNotFoundException: Could not load file or assembly 'X' or one of its dependencies when deploying the application,我的假设是,尽管为ARM构建了dll,但其中一个仍然存在一个依赖于Win32 dll的依赖,可以预见,无法找到它(因此FileNotFoundException)。
当我在Dependency Walker中加载为ARM构建的每个dll时,我没有看到任何依赖于Win32,与我为ARM构建的其中一个dll的异常 source,icuuc56.dll,我可以看到它有kernel32(advapi32)作为依赖。我的理解是Windows Mobile不会提供这些操作系统依赖项(因此FileNotFoundException?)。并且动态加载此特定Win32依赖项会导致应用程序崩溃。
我想构建没有链接到Win32库的icuuc56.dll 的ARM版本。至少我可以确定ICU4C的哪些部分依赖于Win32函数调用。但令人抓狂的是,在为ARM构建时,我无法阻止链接器链接到包含Win32库的%(AdditionalDependencies)。
我是否正确解释了问题?如果是这样,我的问题是:
为什么ICU4C首先针对ARM构建,如果它依赖于Win32 dll?
如何在构建时阻止链接到Kernel32,以便我可以识别ICU4C的哪些部分进行无法在ARM上完成的函数调用。
是否有可以在UWP上使用的OS提供的等效于ICU4C?
更新
当#ifdef WIN32
解析为true时,ICU4C的platform.h设置如下
#define U_PLATFORM_USES_ONLY_WIN32_API 1
#define U_PLATFORM_HAS_WIN32_API 1
如果我尝试使用平台预处理器定义,那么我能得到的最好的就是使用例如tzset而不是_tzset。哪个也不可用(我猜)。
有没有办法为UWP构建ICU4C而不完全重写它?毕竟,它可以针对iOS和Android进行编译。我将深入研究https://sourceforge.net/p/icu/mailman/icu-support/thread/4FEDF14C.3050404@icu-project.org/,但这看起来有点不同。