为何系统MSVC运行时DLL有时会替代本地部署的DLL加载?
以下是几种核心原因:
并行组件模型的优先级干扰
Windows的WinSxS(并行组件存储)机制会优先加载系统注册的MSVC运行时版本。如果你的应用清单文件没有明确声明优先使用本地DLL,或者清单配置不符合MSVC 2022的要求,系统会自动选择已安装在WinSxS中的旧版本,而非你放置在应用目录的新版本。DLL搜索路径被修改
部分第三方工具(如杀毒软件、系统优化程序)或进程注入逻辑,可能通过SetDllDirectory、AddDllDirectory等API修改了进程的DLL搜索顺序,让C:\Windows\System32的优先级高于应用程序所在目录。此外,Windows安全模式下的默认搜索顺序也会跳过应用目录,优先加载系统目录的DLL。进程内已加载旧版本DLL
如果你的应用依赖的第三方库、插件,或者提前启动的系统服务已经加载了旧版本的msvcp140.dll,根据Windows的DLL加载规则,同一进程内同一名称的DLL只会被加载一次。后续你的应用请求加载该DLL时,会直接复用已加载的旧版本,而非本地的新版本。本地DLL异常导致 fallback
部分用户的安装过程中,本地MSVC运行时DLL可能因杀毒软件误删、安装包损坏、应用目录权限不足等原因无法被读取,系统会自动 fallback 到System32目录中查找可用的旧版本。MSVC 2022的DLL变体依赖问题
MSVC 2022的运行时包含多个带后缀的DLL变体(如msvcp140_1.dll、vcruntime140_1.dll)。如果你的应用实际依赖这些变体,但你仅打包了基础的msvcp140.dll,系统可能会加载System32中的旧版本基础DLL来替代,导致版本不兼容。
内容的提问来源于stack exchange,提问作者Alexander Dyagilev

