【发布时间】:2016-03-11 10:36:02
【问题描述】:
我有一个 winforms .net4.5.2 应用程序,它依赖于一个 c++\cli 包装器,它通过引用包含在 VS 项目中。当使用 Any CPU 构建的 winforms 应用程序启动时,程序集解析器用于在应用程序文件夹的根目录中的平台特定文件夹中指出正确的平台 dll 以供参考和 Assembly.Load(ed),即 \ x64 或 \x86。
这个 c++\cli 现在是使用依赖于通用 CRT dll:s 的 v140 平台工具集构建的。看这里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++ 运行时可执行文件.
有人对如何解决此部署问题有任何想法或提示吗?
【问题讨论】:
-
因为我预计没有人愿意回答有关在遗留产品中部署的问题(可能是因为唯一的解决方案是安装在现实中不适用的运行时,在我看来,在许多不同的行业)我写了我写过的最愚蠢的代码来解决这个问题。就在解析程序集之前,将复制所有 41 个 dll:s 的当前运行平台的根文件夹。这只是让我很生气,很抱歉咆哮:/但至少我有一个解决方案:)
-
也受此困扰。我不认为我可以接受这样的解决方案! :p
-
哦,我明白了 :)
标签: visual-studio dll deployment c++-cli .net-assembly