VisualStudio 2022 CRT MergeModules перезаписывает более новую версию msvcp140.dll

Мое приложение C++ создано с помощью Visual Studio 2022 v17.4, в которой есть инструменты MSVC 14.34.31933, а затем с помощью набора инструментов WiX создается установочный пакет Windows .MSI.

Product.wxs файл содержит следующие строки для включения распространяемого компонента VC:

    <DirectoryRef Id = "TARGETDIR">
      <Merge Id = "VCRedist" SourceFile = "$(env.ProgramW6432)\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\v143\MergeModules\Microsoft_VC143_CRT_x64.msm" DiskId = "1" Language = "0"/>
    </DirectoryRef>
    <Feature Id = "VCRedist" Title = "Microsoft VC143 CRT" AllowAdvertise = "no" Display = "hidden" Level = "1">
      <MergeRef Id = "VCRedist"/>
    </Feature>

С выходом Visual Studio 2022 v17.10 выяснилось, что мой установщик перезаписывает более новую C:\Windows\System32\msvcp140.dll версию 14.40.33810.0 более старой версией 14.34.31931.0. После этого все программы, созданные в последней версии Visual Studio , вылетают при запуске из-за std::mutex::lock() несовместимости.

В журнале установки, выданной командой:

msiexec /i myapp.msi /L*V install.log

Я понимаю

MSI (s) (D0:7C) [12:07:18:334]: Feature: VCRedist; Installed: Absent;   Request: Local;   Action: Local
...
MSI (s) (D0:7C) [12:07:18:344]: Component: msvcp140.dll_system_amd64.DFEFC2FE_EEE6_424C_841B_D4E66F0C84A3; Installed: Absent;   Request: Local;   Action: Local

как будто новый распространяемый файл вообще не найден.

Что необходимо изменить в проекте WiX, чтобы файл .MSI устанавливал распространяемый MSVC только в том случае, если он новее, чем уже есть в системе, и не менял его в противном случае?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этих строках журнала просто говорится, что компонент не зарегистрирован на компьютере. Проблема не в них. Позже в файле журнала вы увидите сообщения о фактически устанавливаемых файлах, и они более полезны.

Могу поспорить, что у вас REINSTALLMODE настроена принудительная перезапись. Но вы не предоставляете достаточно информации о том, что нужно знать вашему коду.

Спасибо. Действительно, REINSTALLMODE было установлено на "amus" (a вместо o). И возврат его к значению по умолчанию устранил проблему.

Fedor 24.06.2024 10:18

Другие вопросы по теме