MS 是否正式支持加载 MSVCR(或 UCRT 等)的发行版和调试版?
Is loading both release and debug version of MSVCR (or UCRT etc.) officially supported by MS?
当您 link 到 MS Visual C Runtime Library from your (C++) program, you normally only link against one version, the release or debug version: Either MSVCR<ver>.dll
or MSVCR<ver>D.dll
or with VS2015 ucrtbase[D].dll
及其附加依赖项时。
免责声明: 混合使用它们的 用法 并从一个到另一个交换指针(等)将导致崩溃和精神错乱 --这是不是这个问题的内容。
但是,当您的 C 或 C++ 程序 link 连接到仅在发布变体中交付的第 3 方 (C) DLL,并且该 DLL 在内部使用 MSVCR (!),它将 link 加载到发布版本,即使您 运行 您的程序处于调试版本。 (这种情况的一个变体是,第 3 方库可以再次 内部 ,也使用与您完全不同的 MSVCR###.dll 版本,在这种情况下,它们甚至会有所不同你的发布版本。
这对我来说是一个非常标准的场景,我一直认为这个 "just works"(确实 确实 )。
不过,我一直在想,这是否真的是这些 MS 库的预期和支持方案?是吗?有没有相反的经历?
是的,这是受支持的,而且很常见。
例如,如果您构建一个 C++/CLI Windows Forms 应用程序,您最终可能会在该过程中加载至少三个不同的 CRT:您的程序将使用 msvcr.dll, CLR 将使用 msvcr120_clr0400.dll,您进程中加载的各种操作系统组件可能会使用 msvcrt.dll.
当您 link 到 MS Visual C Runtime Library from your (C++) program, you normally only link against one version, the release or debug version: Either MSVCR<ver>.dll
or MSVCR<ver>D.dll
or with VS2015 ucrtbase[D].dll
及其附加依赖项时。
免责声明: 混合使用它们的 用法 并从一个到另一个交换指针(等)将导致崩溃和精神错乱 --这是不是这个问题的内容。
但是,当您的 C 或 C++ 程序 link 连接到仅在发布变体中交付的第 3 方 (C) DLL,并且该 DLL 在内部使用 MSVCR (!),它将 link 加载到发布版本,即使您 运行 您的程序处于调试版本。 (这种情况的一个变体是,第 3 方库可以再次 内部 ,也使用与您完全不同的 MSVCR###.dll 版本,在这种情况下,它们甚至会有所不同你的发布版本。
这对我来说是一个非常标准的场景,我一直认为这个 "just works"(确实 确实 )。
不过,我一直在想,这是否真的是这些 MS 库的预期和支持方案?是吗?有没有相反的经历?
是的,这是受支持的,而且很常见。
例如,如果您构建一个 C++/CLI Windows Forms 应用程序,您最终可能会在该过程中加载至少三个不同的 CRT:您的程序将使用 msvcr.dll, CLR 将使用 msvcr120_clr0400.dll,您进程中加载的各种操作系统组件可能会使用 msvcrt.dll.