2016-03-11 41 views
0

我有一个winforms .net4.5.2应用程序,它依赖于通过引用包含在VS项目中的C++ \ cli包装器。当使用任何CPU构建的winforms应用程序启动时,使用程序集解析器指出应用程序文件夹根目录中的平台特定文件夹中的引用和Assembly.Load(ed)的正确平台dll,例如\ x64或\ x86。带遗留应用程序的Visual Studio C++ 2015运行时部署

此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++运行时的客户端上安装C++运行时可执行文件应用。

有没有人有关于如何解决这个部署问题的想法或任何提示?

+0

因为我预料到无人问津回答有关在传统产品的部署(可能是因为唯一的解决办法就是安装问题在我看来,在许多不同的行业中,实际上不适用的运行时)我写了我写过的用于解决这个问题的最愚蠢的代码。在解析程序集之前,将复制到所有41 dll:s的当前运行平台的根文件夹中。这只是让我生气,所以很抱歉咆哮:/但至少我有一个解决方案:) – tompish

+0

也患有这种情况。我不认为我可以接受这样的解决方案! :p – dten

+0

哦,想我明白了:) – dten

回答

0

所以,你基本上想要x-xopy部署x86-dll在MyApp \ x86和x64-dll在MyApp \ x64中?

如何显式加载DLL的LoadLibrary?

0

我用procmon来检查UCRT DLL试图从哪里加载对方。注意到它搜索的路径不包括早期的SetDllDirectory设置的路径。无论我尝试搜索的路径,它似乎只包含默认值。

工作目录总是包含在Dynamic-Link Library Search Order中,唯一的解决方案是将当前工作目录更改为合适的目录,使用UCRT要求加载DLL并将其更改回来。没有别的工作(包括更改PATH环境变量)

注意这是很多不是线程安全的

相关问题