Как явно удалить DLL во время Majorupgrade, используя Wix Toolset
Мы пытаемся развернуть обновление для нашего продукта, которое содержит обновленную DLL. Эта dll также имеет номер версии, поэтому обычно установщик должен видеть это и заменять старый dll.
Установщик Windows заботится только о первых трех числах при проверке номера версии. Однако в этом случае обновленный номер версии выглядит так же, за исключением четвертого номера. Так, например, если предыдущая версия была 1.0.0.12, то она имеет 1.0.0.20, поэтому установщик видит их как ту же версию и не заменяет файл. Я не контролирую нумерацию версий в этом случае, и, поскольку мы включаем много dll, это может произойти снова в будущем.
Как можно заставить установщик заменить файл, независимо от того, совпадает ли номер версии?
После поиска различных решений я попытался сказать установщику, что нужно удалить файл в процессе установки. Я не хочу удалять все файлы, если не нужно. До сих пор я пробовал решение, как показано во включенном фрагменте кода. Элемент removefile является новым в этой версии установщика.
<Component Id="SomeComponent" Win64="yes" Guid="*">
<File Id="SomeFile" KeyPath="yes" Source="$(var.app.TargetDir)\some.dll" />
<RemoveFile Id="RemoveSomeFile" Name="some.dll" On="install"/>
</Component>
В результате я ожидаю, что старый dll будет заменен новым dll, однако после установки старый dll все еще там, а нового нет.
1 ответ
Companion Files: Как использовать Companion Files в WiX - просто фрагмент (после отладки было обнаружено, что у OP возникла проблема с необходимостью понизить версию файла вместо проблемы с количеством цифр версии - очень распространенная проблема):
<..>
<Component Id="MyFile.exe" Feature="Main">
<File Id="MyFile.exe" Source="MyFile.exe"></File>
</Component>
<Component Id="MyFile_2.exe" Guid="{0EBDFD64-017B-428F-BB67-3D82EA2A99AF}" Feature="Main">
<File Source="MyFile_2.exe" CompanionFile="MyFile.exe"></File>
</Component>
<..>
Краткий обзор: во втором компоненте мы указываем на файл первого компонента, так что MyFile_2.exe будет устанавливаться всякий раз, когда MyFile.exe установлен - независимо от проблем с версиями.
Более старый ответ ниже оставлен для справки и источника WiX, который можно использовать для тестирования.
Версия MSI: установщик Windows заботится только о первых трех числах при проверке номера версии.
Версия файла против ProductVersion: приведенное выше утверждение в целом верно, но, насколько мне известно (и основано на быстром тесте на дым), это 3-значное ограничение относится только к MSI ProductVersion
(версия самой MSI), а не фактическая file version numbers
,
Версии файлов соблюдаются в 4 цифры, в отличие от 3-значного ограничения для MSI
ProductVersion
(версия для самой MSI). Пожалуйста, запустите тест самостоятельно, чтобы быть уверенным. Пример разметки WiX, чтобы сделать это ниже.
REINSTALLMODE: механизм модификатора перезаписи файлов REINSTALLMODE может использоваться для принудительной перезаписи файлов независимо от версии. Этот механизм не следует использовать, поскольку он может вызвать ряд проблем: ненужные запросы на перезагрузку, понижение системных общих файлов, некоторые файлы должны быть обновлены, а другие - нет (старые и новые пакеты установлены не по порядку) в более ранних версиях Windows происходит сбой при попытке понизить защиту защищенных файлов и т. д.
Тестовый источник WiX Mockup: я приведу здесь простой тестовый источник WiX, чтобы помочь вам быстро его протестировать (например, на разных версиях ОС, я тестировал на Windows 10):
В связи с этим, из-за некоторых присущих этому проекту характеристик дизайна, он также проиллюстрирует, что основные обновления завершаются неудачно, когда вы увеличиваете только последнюю цифру 4-значного номера версии, но перезаписи файлов будут работать. Когда вы устанавливаете версию 2, вы найдете две записи о продукте в разделе "Установка и удаление программ". Это ожидается на основе дизайна образца. Просто удалите оба.
<?define MyVersion = "1.0.0.0" ?>
<?define MyReleasePath = "$(sys.SOURCEFILEDIR)_Files\$(var.MyVersion)\" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="FileVersioning" Language="1033" Version="$(var.MyVersion)"
Manufacturer="FileVersioning" UpgradeCode="{4864AA4A-EA1D-4367-8427-85D296B0A2A6}">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="Main" Title="FileVersioning" Level="1" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="FileVersioning">
<Component Feature="Main">
<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>
</Component>
</Directory>
</Directory>
</Directory>
</Product>
</Wix>
Использование:
- Создайте проект WiX, замените содержимое шаблона с разметкой выше.
- Создайте подпапку в папке проекта WiX, которая называется
_Files
и две дополнительные подпапки там с двумя версиями одного и того же файла, как показано ниже.- Быстрый путь: в Visual Studio щелкните правой кнопкой мыши проект WiX и выберите
Open Folder in File Explorer
чтобы быстро добраться до папки проекта WiX. - Теперь вставьте в две папки или создайте их.
- Вы можете открыть EXE в Visual Studio, чтобы "взломать" номер версии, чтобы вы использовали один и тот же EXE или DLL в обеих папках с разными номерами версий. Смотрите раздел ниже для информации.
- Быстрый путь: в Visual Studio щелкните правой кнопкой мыши проект WiX и выберите
- Измените MyVersion define на номер версии, которую вы хотите создать. Например:
<?define MyVersion = "23.4.5.2" ?>
, Это также влияет на то, где образец ожидает, что исходный файл будет расположен на диске. - Обновите имя файла в элементе File, чтобы оно соответствовало имени вашего версионного файла (
<File Source="$(var.MyReleasePath)MyTestFile.exe"></File>
). - Скомпилируйте установку, установите ее, проверьте номер версии установленного файла.
- Измените версию WiX и скомпилируйте следующую настройку (
<?define MyVersion = "23.4.5.3" ?>
). - Установить поверх существующей установки. Убедитесь, что установлена новая версия файла.
Структура папок для версионных файлов (создается внутри основной папки проекта):
_Files
23.4.5.2\MyTestFile.exe
23.4.5.3\MyTestFile.exe
Откройте EXE как ресурс: в Visual Studio попробуйте это:
File
=>Open
=>File
- Найдите версионный файл (
EXE
,DLL
,etc...
) - Нажмите версионный файл один раз (и только один раз)
- Нажмите стрелку вниз для
Open
кнопка =>Open With...
- Выбрать
Resource Editor
и откройте файл. - разместить
Version section
, откройте и дважды щелкните запись. - Измените номера версий, сохраните новую версию файла (не поверх существующей).
Ссылки: