我有一个winforms .net4.5.2应用程序,它依赖于一个c ++ \ cli包装器,它通过引用包含在VS项目中。当启动使用Any CPU构建的winforms应用程序时,程序集解析器用于指示正确的平台dll以供参考,并在应用程序文件夹根目录中的平台特定文件夹中指定Assembly.Load(ed),即\ x64或\ x86。
这个c ++ \ cli现在使用v140平台工具集构建,该工具集依赖于Universal CRT dll:s。在这里https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/我能够找到必要的dll:s(其中41 * 2),我按照我的要求将它们复制到\ x86和\ x64文件夹中。现在自从更改到v140平台后,我的应用程序不再启动,ProcessMonitor文件操作告诉我以下内容:
SUCCESS C:\MyApp\x64\TheCLIWrapper.x64.dll
SUCCESS C:\MyApp\x64\ADependency.dll
SUCCESS C:\MyApp\x64\msvcp140.dll
SUCCESS C:\MyApp\x64\vcruntime140.dll
SUCCESS C:\MyApp\x64\api-ms-win-crt-runtime-l1-1-0.dll
NAME NOT FOUND C:\MyApp\ucrtbase.dll
如果在汇编解析我的c ++ \ cli包装器之前,我将dll目录(使用SetDllDirectory)显式设置为C:\ MyApp \ x64文件夹,这怎么可能呢?我的意思是为什么加载过程在c:\ MyApp中查找ucrtbase.dll?
当然,如果特定平台的所有41个dll都被复制到根C:\ MyApp \文件夹,它可以工作,但这对我来说不是一个选项,也不是在运行应用程序的客户端上安装c ++运行时可执行文件
有没有人对如何解决此部署问题有任何想法或提示?
答案 0 :(得分:0)
所以你基本上想在MyApp \ x86中使用x86-dll进行x-xopy部署,在MyApp \ x64中使用x64-dll进行x-xopy部署?
如何使用LoadLibrary明确加载dll?
答案 1 :(得分:0)
我使用procmon
来检查UCRT DLL试图从哪里加载。注意到它搜索的路径不包括早期SetDllDirectory中设置的路径。无论我尝试了什么,它搜索的路径似乎只包含默认值。
工作目录始终按照Dynamic-Link Library Search Order包含,我唯一可以解决的方法是将当前工作目录更改为适当的工作目录,加载具有UCRT要求的DLL,然后将其更改回来。没有其他工作(包括更改PATH环境变量)
请注意,这绝不是线程安全的