Как заменить удаленную часть MSI
-
14-10-2019 - |
Вопрос
Я создаю установщик MSI, используя проект установки VS2010.
Теперь проект не DEINSTALL из -за исключения «1001: неверный формат для аргументов MachinENAME» (см. Ниже) внутри пользовательского действия.
Я не подлежат удалению приложения, используя удаление из управления системой или msiexec /uninstall
.
Есть ли способ принудительно установить?
Подробности:
В рамках пользовательского действия я зарегистрировал пользовательский источник событий, который мое приложение использует для входа в события в журнале Windows:
public override void Install(IDictionary stateSaver) {
base.Install(stateSaver);
EventLog.CreateEventSource("VeodinRecorder","Application");
}
Внутри "удаления" я пытаюсь удалить это события с
if (!EventLog.SourceExists("VeodinRecorder"))
EventLog.Delete("VeodinRecorder"); `
EventLog.Delete также принимает MachinENAME в качестве второго аргумента, поэтому я попытался перезаписать MSI, используемый для удаления с msiexec /fv
и изменил действие удаления:
EventLog.Delete("VeodinRecorder",".");
EventLog.Delete("VeodinRecorder","Application");
Я даже оставил все "удаление действия" пустым.
Но, казалось, ничего не сработало.
Какие -нибудь подсказки?
Полный журнал:
Ошибка 1001. Ошибка 1001. Исключение произошло при удалении. Это исключение будет проигнорировано, и удаление будет продолжаться. Тем не менее, приложение может не полностью удалить после завершения удаления. -> Неверный формат для аргументации MachineName. MSI (S) (60! 68) [22: 49: 00: 101]:
Отладка: Ошибка 2769: Пользовательское действие _3C1D0358_8969_4B01_B8FA_B6B43F4E9E4C.UNININSTALL не закрыл 1 MSIHandles.
Установщик столкнулся с неожиданной ошибкой, установив этот пакет. Это может указывать на проблему с этим пакетом. Код ошибки составляет 2769. Аргументы: _3C1D0358_8969_4B01_B8FA_B6B43F4E9E4C.UNININSTALL, 1, CustomAction _3C1D0358_8969_4B01_B8FA_B6B43F4E9E4C.
Действие закончилось 22:49:00: Installexecute. Возвращаемое значение 3.
Действие закончилось 22:49:00: установить. Возвращаемое значение 3.
Решение
Кажется, что CustomAction.DLL не был обновлен при обновлении установки с msiexec /fv
.
Теперь я вручную поместил недавно сборку CustomAction.dll (с пустым переопределением удаления) в папку установки и смог удалить.
Обновлять: (Кредиты @pcans) Используйте ORCA для редактирования в настоящее время установленного MSI и вручную отключить удаление пользовательского действия.
Другие советы
Просто для справки Я хочу добавить, что вы также можете Установить установленное продукт с незначительное обновление Удалить любые неисправные действия в последовательности удаления, прежде чем их призвать. Это работает, потому что незначительное обновление - это переустановка того же продукта, а не удаление и переустановка новой версии (которая является серьезным обновлением). Следовательно, вы заменяете последовательность удаления на правильную, прежде чем ошибочный запуск.
Создание патча довольно сложно, даже с профессиональными инструментами, такими как Wise или InstallShield, но в некоторых случаях это единственное исправление, которое работает для правильного удаления пакета. Пакет «в дикой природе» в компании должен быть исправлен таким образом.
Наконец вы можете использовать msizap.exe От Microsoft до регистрации целого неисправного пакета из базы данных установщика Windows, но это не очень хорошо, поскольку изменения в системе вообще не откатаются, а много мусора остается повсюду. Сам инструмент также иногда кажется немного шатким, иногда создавая новые ошибки, которые действительно трудно исправить. Желательно использовать его для только отладка.
Еще одна заметка в этом уже длинном ответе: особый случай это когда вы запускаете пользовательское действие только во время последовательности удаления, а затем возвращает неисправный код возврата - иногда даже если он выполнял свои операции ОК. Эти действия могут вызвать очень раздражение »удалить только ситуацию с откатом«Эффективно ваш удаление переворачивается назад, когда он попадает в индивидуальное действие, которое никогда не проводилось во время установки. Это выпустит удаление и, следовательно, будет работать в качестве установки - ваш продукт остается на машине. Довольно странно.
Нижняя линия: Пропустите коды возврата для пользовательских действий, которые выполняются во время удаления, используйте другие механизмы проверки, чтобы обеспечить успешное действие.