【问题标题】:Visual Studio c++ 2015 runtime deployment with legacy application使用旧版应用程序的 Visual Studio c++ 2015 运行时部署
【发布时间】: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


【解决方案1】:

所以你基本上想用 MyApp\x86 中的 x86-dll 和 MyApp\x64 中的 x64-dll 进行 x-xopy 部署?

使用 LoadLibrary 显式加载 dll 怎么样?

【讨论】:

  • 四年后,您的建议对我有用。在使用我的应用程序库的相对路径调用 setdlldirectory 后,我在 program.cs 中显式加载了 ucrtbase.dll。
【解决方案2】:

我使用procmon 来检查 UCRT DLL 试图从何处相互加载。注意到它正在搜索的路径不包括早期 SetDllDirectory 中设置的路径。无论我尝试什么,它搜索的路径似乎都只包含默认值。

根据Dynamic-Link Library Search Order 始终包含工作目录,我能得到的唯一解决方案是将当前工作目录更改为适当的目录,加载具有 UCRT 要求的 DLL,然后将其更改回来。没有其他工作(包括更改 PATH 环境变量)

注意这不是线程安全的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多