c++ - 非托管 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.1和Windows 10。
注意:如果这很重要,我将从 .Net 调用非托管 C++ 程序集。
解决方案
CRT
您的dll 的加载顺序如下:
- 启动应用程序的目录
- 当前目录
- 系统目录
- 视窗目录
- 路径环境变量。
您可以将运行时 dll 放在应用程序的当前目录中,它们应该会加载。如果您在 Windows 10 上编译并且不想UCRT
引用,请使用/NODEFAULTLIB
CRT
或者,您可以使用 compile 选项静态链接到库/MT
推荐阅读
- java - Maven、Jersey、JSON、Tomcat、错误 MessageBodyWriter 未找到媒体类型 = 应用程序/json
- python - 使用 NN 加速多标签分类训练
- asciidoc - 如何将 asciidoc 转换为 pdf?
- android - Android 上的自定义字体会降低性能吗?
- python - 以前的解决方案不起作用:TypeError: 'str' object is not callable
- python - Tensorflow 的损失函数在将 RNN 更改为 LSTM 单元后返回 NAN
- .net - .NET Core React Redux 模板 JS 404 部署问题
- javascript - 使用未捆绑的外部全局变量文件
- jmeter - 来自 CSV 的 JMeter 动态 http 请求参数
- c++ - 如何为模板类的模板函数定义模板特化