Установите среду выполнения .NET и избегайте 0x80070666 другая версия этого продукта уже установлена, код возврата 0x666

Я устанавливаю настольное приложение .NET 6. В рамках установщика я устанавливаю среду выполнения .NET 6.0.10 для рабочего стола, используя WiX:

<ExePackage
  SourceFile = "$(var.ProjectDir)\ThirdParty\windowsdesktop-runtime-6.0.10-win-x64.exe"
  InstallCommand = "/q /ACTION=Install"
  RepairCommand = "/q ACTION=Repair /hideconsole"
  UninstallCommand = "/q ACTION=Uninstall /hideconsole" />

Это прекрасно работает, если не установлена ​​предыдущая версия 6.0.x среды выполнения. Он также отлично работает, если 6.0.10 уже установлена. Однако, если установлена ​​другая версия 6.0.x, программа установки не работает:

Error 0x80070666: Process returned error: 0x666

С сообщением в пользовательском интерфейсе «уже установлена ​​другая версия этого продукта».

Кто-нибудь знает простой способ в WiX обновить более ранние версии или пропустить пакет, если более поздняя версия уже установлена?

Я бы предложил удалить тег c#, так как это, похоже, не имеет ничего общего с c#.

JonasH 07.12.2022 11:50
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно использовать атрибут DetectCondition.

<Variable Name = "NetCore6Version" Type = "numeric" Value = "1.0.0" />
<Variable Name = "MinNetCore6Version" Type = "numeric" Value = "6.0.10" />
<util:RegistrySearch Root = "HKLM" Key = "SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost" Value = "Version" 
 Variable = "NetCore6Version" /> 

<ExePackage
  SourceFile = "$(var.ProjectDir)\ThirdParty\windowsdesktop-runtime-6.0.10-win-x64.exe"
  InstallCommand = "/q /ACTION=Install"
  RepairCommand = "/q ACTION=Repair /hideconsole"
  UninstallCommand = "/q ACTION=Uninstall /hideconsole"
  DetectCondition = "NetCore6Version &lt;=MinNetCore6Version"
  InstallCondition = "NetCore6Version &gt;MinNetCore6Version" />

Спасибо, заработало благодаря этому. Type должен быть version, а не numeric, и я также удалил DetectCondition и использовал InstallCondition = "(NetCore6Version &lt; MinNetCoreVersion) AND NOT Remove", чтобы избежать повторной установки пакета во время удаления.

Pete 13.12.2022 19:01

Были дополнительные проблемы с этим подходом - опубликовали мое возможное решение в качестве ответа.

Pete 14.12.2022 15:24

@Pete, если вы обнаружили, что этот ответ помог вам найти окончательное решение, было бы неплохо проголосовать за этот ответ.

user700390 17.12.2022 17:07

@user700390 user700390 У меня недостаточно репутации, чтобы голосовать!

Pete 18.12.2022 18:11
Ответ принят как подходящий

Это во многом обязано ответу Вивека, но у него были проблемы - упомянутый там раздел реестра перезаписывается последней установленной вами версией .NET и не может справиться с установкой нескольких (6.0, 7.0 и т. д.) фреймворков.

Решение, с которым я закончил, имеет жестко закодированный поиск будущих версий 6.0.x, что не идеально, но лучшее, что я придумал.

<!-- We won't attempt to install .NET 6.0.x (x64) if any of these versions are already present
     If there's ever a 6.0.21 or higher we'll have to extend this list -->
<util:DirectorySearch Id = "DSNet6x64v6010" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.10" Variable = "Net6x64v6010" />
<util:DirectorySearch Id = "DSNet6x64v6011" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.11" Variable = "Net6x64v6011" />
<util:DirectorySearch Id = "DSNet6x64v6012" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.12" Variable = "Net6x64v6012" />
<util:DirectorySearch Id = "DSNet6x64v6013" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.13" Variable = "Net6x64v6013" />
<util:DirectorySearch Id = "DSNet6x64v6014" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.14" Variable = "Net6x64v6014" />
<util:DirectorySearch Id = "DSNet6x64v6015" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.15" Variable = "Net6x64v6015" />
<util:DirectorySearch Id = "DSNet6x64v6016" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.16" Variable = "Net6x64v6016" />
<util:DirectorySearch Id = "DSNet6x64v6017" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.17" Variable = "Net6x64v6017" />
<util:DirectorySearch Id = "DSNet6x64v6018" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.18" Variable = "Net6x64v6018" />
<util:DirectorySearch Id = "DSNet6x64v6019" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.19" Variable = "Net6x64v6019" />
<util:DirectorySearch Id = "DSNet6x64v6020" Path = "[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.20" Variable = "Net6x64v6020" />

<!-- And same for the x86 version -->
<util:DirectorySearch Id = "DSNet6x86v6010" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.10" Variable = "Net6x86v6010" />
<util:DirectorySearch Id = "DSNet6x86v6011" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.11" Variable = "Net6x86v6011" />
<util:DirectorySearch Id = "DSNet6x86v6012" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.12" Variable = "Net6x86v6012" />
<util:DirectorySearch Id = "DSNet6x86v6013" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.13" Variable = "Net6x86v6013" />
<util:DirectorySearch Id = "DSNet6x86v6014" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.14" Variable = "Net6x86v6014" />
<util:DirectorySearch Id = "DSNet6x86v6015" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.15" Variable = "Net6x86v6015" />
<util:DirectorySearch Id = "DSNet6x86v6016" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.16" Variable = "Net6x86v6016" />
<util:DirectorySearch Id = "DSNet6x86v6017" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.17" Variable = "Net6x86v6017" />
<util:DirectorySearch Id = "DSNet6x86v6018" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.18" Variable = "Net6x86v6018" />
<util:DirectorySearch Id = "DSNet6x86v6019" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.19" Variable = "Net6x86v6019" />
<util:DirectorySearch Id = "DSNet6x86v6020" Path = "[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\6.0.20" Variable = "Net6x86v6020" />

<Chain>
  <ExePackage
      SourceFile = "$(var.ProjectDir)\ThirdParty\windowsdesktop-runtime-6.0.10-win-x64.exe"
      InstallCommand = "/q /ACTION=Install"
      RepairCommand = "/q ACTION=Repair /hideconsole"
      UninstallCommand = "/q ACTION=Uninstall /hideconsole"
      InstallCondition = "NOT Net6x64v6010 AND NOT Net6x64v6011 AND NOT Net6x64v6012 AND NOT Net6x64v6013 AND NOT Net6x64v6014 AND NOT Net6x64v6015 AND NOT Net6x64v6016 AND NOT Net6x64v6017 AND NOT Net6x64v6018 AND NOT Net6x64v6019 AND NOT Net6x64v6020 AND NOT Remove"/>
  <ExePackage
      SourceFile = "$(var.ProjectDir)\ThirdParty\windowsdesktop-runtime-6.0.10-win-x86.exe"
      InstallCommand = "/q /ACTION=Install"
      RepairCommand = "/q ACTION=Repair /hideconsole"
      UninstallCommand = "/q ACTION=Uninstall /hideconsole"
      InstallCondition = "NOT Net6x86v6010 AND NOT Net6x86v6011 AND NOT Net6x86v6012 AND NOT Net6x86v6013 AND NOT Net6x86v6014 AND NOT Net6x86v6015 AND NOT Net6x86v6016 AND NOT Net6x86v6017 AND NOT Net6x86v6018 AND NOT Net6x86v6019 AND NOT Net6x86v6020 AND NOT Remove"/>
</Chain>

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