Я устанавливаю настольное приложение .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 обновить более ранние версии или пропустить пакет, если более поздняя версия уже установлена?
Вам нужно использовать атрибут 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 <=MinNetCore6Version"
InstallCondition = "NetCore6Version >MinNetCore6Version" />
Спасибо, заработало благодаря этому. Type
должен быть version
, а не numeric
, и я также удалил DetectCondition
и использовал InstallCondition = "(NetCore6Version < MinNetCoreVersion) AND NOT Remove"
, чтобы избежать повторной установки пакета во время удаления.
Были дополнительные проблемы с этим подходом - опубликовали мое возможное решение в качестве ответа.
@Pete, если вы обнаружили, что этот ответ помог вам найти окончательное решение, было бы неплохо проголосовать за этот ответ.
@user700390 user700390 У меня недостаточно репутации, чтобы голосовать!
Это во многом обязано ответу Вивека, но у него были проблемы - упомянутый там раздел реестра перезаписывается последней установленной вами версией .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>
Я бы предложил удалить тег c#, так как это, похоже, не имеет ничего общего с c#.