Major Upgrade - .exe файл не переустанавливается
У меня есть MSI-файл, созданный программой MSICREATE и подправленный с помощью orca следующим образом...
InstallExecuteSequence Table
* added FindRelatedProducts with sequence 410
* added RemoveExistingProducts with sequence 1450
InstallUISequence Table
* added FindRelatedProducts with sequence 200
PropertyTable
* added RemovePreviousVersions TRUE
* added SECURECUSTOMPROPERTIES SOLARUPGRADE
* had a existing UpgradeCode with guid created by MSICREATE
* had a existing ProductVersion 12.2.12.0 created my MSICREATE
Добавлена таблица обновлений
* UpgradeCode same value as Upgrade in Property Table
* VersionMin null
* VersionMax 99.12.31
* Attributes 1
* ActionProperty SOLARUPGRADE (same value as SECURECUSTOMPROPERTIES in Property Table)
Я также назначил новый PackageCode и новый ProductCode, чтобы новый msi имел значения PackageCode, ProductCode и ProductVersion, отличные от ранее установленного продукта.
Когда я запускаю этот msi с ранее установленным продуктом, старый продукт удаляется, создается новый каталог программных файлов и все файлы, кроме.exe, переустанавливаются из нового.msi. Восстановление приведет к созданию.exe. Если новая msi установлена ПОСЛЕ удаления старого продукта (с помощью панели управления установкой / удалением программ), будут установлены все файлы, включая.exe.
Файл журнала msiexec - mywebspace.wisc.edu/mdorl/msilog/log3.log
MSI - это mywebspace.wisc.edu/mdorl/msilog/sbl_Major_Upgrade.msi
Единственное, что мне кажется странным, это следующие строки из журнала. Первый, второй и четвертый файлы устанавливаются, третий - EXE-файл, который не устанавливается. ЗАМЕТЬТЕ НУЛЕВОЕ ДЕЙСТВИЕ НА ЭТОЙ ВХОДЕ.
Action start 8:04:41: InstallValidate.
MSI (s) (18:F4) [08:04:41:671]: Feature: _MainFeature; Installed: Absent; Request: Local; Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _24A30964F6B6462282E161248AF15827; Installed: Absent; Request: Local; Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _7B95B32E33EB4F699B44D53CA5BC22B5; Installed: Absent; Request: Local; Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _2FBD153583AF40C09EB9920149F7C7B7; Installed: Absent; Request: Local; Action: Null
MSI (s) (18:F4) [08:04:41:671]: Component: _38A400D7DB76479CA0EC6D643D5793CD; Installed: Absent; Request: Local; Action: Local
4 ответа
Записи в таблице файлов ALL не имеют версии. Почему файлы не.exe обрабатываются по-разному и переустанавливаются?
Я полагаю, что другие файлы имеют увеличенную версию. Установщик Windows должен применить правила управления версиями ко всем файлам из пакета.
Таким образом, это означает, что для пользователя невозможно установить более старую версию продукта с использованием серьезного обновления MSI?
Я не вижу решения, если вы хотите сохранить версию меньше в новом пакете. За исключением, конечно, пользовательских действий.
И что составляет юридическую версию? В одном месте я вижу 255.255.65535, а в другом - 65535.65535.65535.65535
Оба они являются правильными номерами версий. Последнее значение обычно устанавливается на файл, чтобы быть уверенным, что оно заменяет любой другой существующий файл с компьютера, то есть его максимальный номер версии, разрешенный ОС. http://msdn.microsoft.com/en-us/library/windows/desktop/aa368596(v=vs.85).aspx
Если вы посмотрите в журнале строку 603, вы найдете следующее:
MSI (s) (18:10) [08:04:41:827]: запрещение удаления компонента: {ADC6C3E9-A0CF-4AFC-9998-7B9449C8EA10}, поскольку существует другой клиент MSI (18:10) [08:04:41:827]: запрещение удаления компонента: {F74907E7-607E-49D1-B613-D63A36ADB020}, поскольку существует другой клиент MSI (18:10) [08:04:41:827]: запрещение удаления компонент: {B1FE4023-E176-42BC-92C3-15B8E50CFBB0}, поскольку существует другой клиент MSI (18:10) [08:04:41:827]: запрещение удаления компонента: {E6F5DF5D-3460-4B44-8743-48787E68A2C1}, так как существует другой клиент
Это может произойти, если одни и те же компоненты совместно используются несколькими пакетами, установленными на одном компьютере. Установщик Windows ведет учет для компонентов и позволяет удалять их, пока не будут удалены все приложения, которые их используют.
Если вы столкнулись с этим на своем компьютере для тестирования / разработки, я рекомендую тестировать на чистой ВМ, чтобы другие предыдущие тесты не влияли на это.
Кроме того, если вы знаете, что вы использовали одни и те же компоненты в пакетах для других приложений, отредактируйте их, убедившись, что у каждого компонента есть уникальный GUID для каждого пакета.
Ради того, чтобы закрыть этот предмет, вот что я обнаружил и что я сделал, чтобы исправить вещи.
1) Я все еще не совсем понимаю, что такое версионный / неверсионный файл. Я предполагаю, что все.exe файлы версионированы. Я предполагаю, что это означает, что такие файлы нуждаются в соответствующих версиях в таблице файлов.
2) Теперь я понимаю, что версия таблицы файлов не должна иметь никакого отношения к ProductVersion.
3) Я использовал нелегальную ProductVersion, например. 2012.02.16. Я переключился на что-то вроде 12.2.16.
4) Я установил.exe VS_VERSION_INFO FILEVERSION в Visual Studio и добавил то же значение в поле Версия таблицы файлов.
Теперь все файлы заменяются, когда я делаю серьезное обновление.
Ключевой файл используется установщиком Windows для обнаружения компонента, а также его GUID. Вот более подробная информация: http://msdn.microsoft.com/en-us/library/windows/desktop/aa370561(v=vs.85).aspx
Как вы и подозревали, установщик Windows также проверяет версию файла, которая, как я предполагал, вы правильно увеличивали в новой версии. Вот правила, которым оно следует: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368599(v=vs.85).aspx
Вам нужно, чтобы столбец версии из таблицы файлов для EXE был установлен на более высокое значение, чем значение, уже существующее на компьютере, в противном случае установщик Windows решит, что лучше сохранить старый, потому что у него более высокая версия.