Восстановление WiX из управляемого загрузчика не позволяет исправить некоторые поврежденные библиотеки DLL

У меня есть приложение WiX Managed Bootstrapper, которое устанавливает некоторые MSI. У меня также есть серия тестов, которые проверяют различные функции установщика. Проблема, с которой я столкнулся, связана с тестом на ремонт. Тест намеренно повреждает все устанавливаемые библиотеки DLL, а затем вызывает установщик EXE с флагами «/ repair / passive». После завершения восстанавливается около 80% DLL, но остальные остаются нетронутыми и, следовательно, все еще повреждены после восстановления.

Если я вручную запускаю msiexec на отдельном MSI с аргументом командной строки «/ fa», который инструктирует MSI принудительно заменить все установленные файлы, он исправляет 100% библиотек DLL.

У меня вопрос: как я могу заставить MBA дать указание каждому MSI ремонтировать таким образом? Я попытался установить для свойства REINSTALLMODE значение amus для отдельных MSI в их файлах .wxs, но MBA перезаписывает их во время выполнения, что видно в журнале по этой строке:

PROPERTY CHANGE: Modifying REINSTALLMODE property. Its current value is 'amus'. Its new value: 'cmuse'.

Я также пытался настроить свойства в MBA для передачи на каждый MSI, но он, похоже, не передает их, а вместо этого использует значения по умолчанию.

Я вижу здесь много похожих вопросов, но на самом деле ни один из них не касается этой конкретной проблемы. Любая помощь будет принята с благодарностью. Роб спаси меня!


person Dillon Forzese    schedule 18.08.2016    source источник
comment
Что журнал установщика msi должен сказать о компонентах, связанных с библиотеками DLL, которые не заменяются?   -  person Brian Sutherland    schedule 19.08.2016
comment
Выполнение операции: ComponentRegister (ComponentId = {0B2B6D28-A32F-4BE8-B990-8DB2A4A790AA}, KeyPath = C: **** \ Estimator.dll, State = 3,, Disk = 1, SharedDllRefCount = 0, BinaryType = 1)   -  person Dillon Forzese    schedule 22.08.2016
comment
Выполнение операции: FileCopy (SourceName = ksncnr0g.dll | Estimator.dll, SourceCabKey = fil46DA9182A232003B1FD10E3DF65EF686, DestName = Estimator.dll, Attributes = 512, FileSize = 2220032, PerTick = 65536,, VerifyCR 1 ,,,,,, ,, InstallMode = 59244544, HashOptions = 0, HashPart1 = -1917773179, HashPart2 = -1616579533, HashPart3 = -79796171, HashPart4 = -1442608125 ,,) MSI (s) (A0: 34) [12: 25: 25: 874] : Файл: C: **** \ Estimator.dll; Не перезаписывать; Не патчится; Существующий файл не версионирован, но изменен   -  person Dillon Forzese    schedule 22.08.2016
comment
Вот информация журнала одной из DLL, которая не была восстановлена.   -  person Dillon Forzese    schedule 22.08.2016


Ответы (1)


Вот твоя проблема прямо здесь:

[12:25:25:874]: File: C:****\estimator.dll; Won't Overwrite;    Won't patch;    Existing file is unversioned but modified

Установщик не хочет перезаписывать файл, который был изменен с момента его установки, если он не может проверить версию или язык (и, возможно, некоторые другие свойства?). Без этих свойств он решает посмотреть на дату изменения. Если он новее, чем когда он был впервые установлен, он не будет его трогать, предполагая вместо этого, что что-то изменилось по какой-то причине, и его возврат приведет к сбою. (Вы можете прочитать больше здесь)

В этом случае вы можете сделать одно - использовать сопутствующий файл.

Установите этот атрибут, чтобы сделать этот файл сопутствующим дочерним по отношению к другому файлу. Состояние установки сопутствующего файла зависит не от его собственной информации о версиях файла, а от управления версиями его сопутствующего родительского файла. Файл, который является ключевым путем для его компонента, не может быть сопутствующим файлом (это означает, что этот атрибут не может быть установлен, если KeyPath = "yes" для этого файла). Атрибут Версия нельзя установить вместе с этим атрибутом, поскольку сопутствующие файлы не устанавливаются на основе их собственной версии.

Обычно вы задаете логику для установки / удаления этого компонента, которая должна быть такой же, как «FileID» другого компонента в установке. В компоненте Estimator.dll в теге File удалите KeyPath="yes" и замените его на CompanionFile="<NameOfAnotherFileID>".

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

Если это ваша dll, я настоятельно рекомендую создать версию файла! Дайте ему любую версию, которую хотите, и эта проблема исчезнет.

Еще одна вещь, которую вы можете попробовать, хотя я не знаю, как это работает на самом деле, - это присвоить файлу DefaultVersion

Это версия этого файла по умолчанию. Компоновщик заменит это значение значением в файле, если параметр подавления файлов не используется.

Это было бы самым быстрым решением для проверки. Просто создайте новый установщик с DefaultVersion="1.0" в <File> в файле Estimator.dll и посмотрите, не заменят ли его. Я думаю, что установщик будет думать, что файл имеет версию 1.0, но установленный файл не имеет версии, поэтому он заменит его (см. здесь)

person Brian Sutherland    schedule 22.08.2016
comment
Большое вам спасибо, это здорово! К сожалению, мне не принадлежат все эти библиотеки DLL. Долгосрочная цель - убедиться, что все они версированы. Наверное, это займет пару месяцев. А пока знаете ли вы, можно ли изменить значение по умолчанию REINSTALLMODE 'cmuse' без его перезаписи? Это было бы хорошим временным решением. - person Dillon Forzese; 23.08.2016
comment
Вы можете изменить его, но для этого потребуется изменить код движка и собрать исходный код wix, чтобы сгенерировать собственный файл burn.exe, что может стать кошмаром для ремонтопригодности, если вы обновите целевую версию wix. Я думаю, что еще одно решение, которое может сработать, - это создание настраиваемого действия для удаления неверсированных DLL во время ремонта (Installed и REINSTALLMODE ~ = cmuse) после InstallInitialize, что приведет к их замене. Что-то вроде взлома. (Возможно, придется переместить его перед InstallValidate? Я не знаю, какое действие на самом деле решает установить компоненты или нет) - person Brian Sutherland; 23.08.2016
comment
Вы пробовали использовать тег DefaultVersion, чтобы проверить, работает ли он? - person Brian Sutherland; 23.08.2016
comment
DafaultVersion работает, так что это проблема. Я собираюсь убедиться, что все файлы имеют версии - person Dillon Forzese; 24.08.2016