首页 > 解决方案 > 非托管 C++ 程序集的加载顺序(特别是 VS C++ 2015 可再发行组件和通用 CRT)

问题描述

这与此处的问题类似,但它与非托管 C++ 程序集有关,而不是托管 .Net 程序集。

假设我的应用程序目录有自己的 Visual Studio Redistributable 2015 运行时 DLL(我在 app 目录中重新分发运行时,以防客户端机器无法从 Windows 更新安装 VC++ 可再发行组件),并且客户端机器也有 Visual Studio Redistributable 2015 包安装。哪个将被加载, vcruntime140.dll位于应用程序目录中,还是已 vcruntime140.dll安装?

同样,我的应用程序目录有自己的一套 Universal C Runtime(同样,我这样做是出于某些客户端机器由于各种原因无法安装 Universal CRT 的原因),并且在客户端机器也安装了 Universal CRT 的情况下,哪一个会被加载,安装的通用 CRT DLL,还是我的应用程序目录中的那些?

对于 Windows 10 和通用 CRT,我知道系统目录中的通用 CRT 始终使用,即使应用程序包含通用 CRT 的应用程序本地副本。即使本地副本较新也是如此,因为通用 CRT 是 Windows 10 上的核心操作系统组件。

但我不确定其他 Windows 10 及更高版本的 Visual Studio C++ 可再发行包。

因此,我正在寻找所有受支持的 Windows 版本的答案,包括Windows 7、Windows 8.1Windows 10

注意:如果这很重要,我将从 .Net 调用非托管 C++ 程序集。

标签: c++windowsassemblies

解决方案


CRT您的dll 的加载顺序如下:

  • 启动应用程序的目录
  • 当前目录
  • 系统目录
  • 视窗目录
  • 路径环境变量。

您可以将运行时 dll 放在应用程序的当前目录中,它们应该会加载。如果您在 Windows 10 上编译并且不想UCRT引用,请使用/NODEFAULTLIB

CRT或者,您可以使用 compile 选项静态链接到库/MT


推荐阅读