Как мне убедить MSI VS2005 обновить?

У меня есть служба Windows, написанная на C # с использованием VS2005.

Установка выполняется с помощью мастера, который вызывает msiexec для установки файла msi, также созданного с помощью VS2005.

У меня возникли проблемы с созданием файла msi, который будет обновлен с одной версии службы до другой. Программа-мастер выполняет обнаружение установленной в данный момент версии, останавливает службу, предлагает соответствующую командную строку для msiexec и затем перезапускает службу.

Существующий msi имеет свойство версии 1.1.02, новый - 1.1.03. Коды продукта и обновления идентичны.

Удаление 1.1.02 вручную с помощью программ добавления / удаления работает нормально, как и установка 1.1.03 в «чистую» систему.

Обновление с 1.1.02 до 1.1.03 проходит без изменений, но конечным результатом является установка 1.1.02.

Командная строка, которую мастер использует для обновления:

msiexec / qb / i "MyProduct.msi" REINSTALL = "ALL" REINSTALLMODE = "vos"

Где я ошибаюсь? Полагаю, я, должно быть, пропустил что-то довольно фундаментальное ...

Альтернативным вариантом является информирование клиентов о том, что им необходимо вручную удалить 1.1.02 перед запуском мастера установки 1.1.03, но я бы предпочел не делать этого.

Отредактировано для добавления:

Изменение кода продукта (как VS2005 также предлагает вам) на самом деле вообще исключает возможность обновления, поскольку установщик не позволит вам выполнить переустановку, если этот код продукта не был ранее установлен.

Все, что он тогда позволит вам сделать, это установить (а затем вы получите обычное сообщение типа «служба уже существует»).


person PD.    schedule 04.02.2009    source источник


Ответы (3)


Есть несколько вещей, которые необходимо сделать, чтобы получить «обновления» для работы с MSI, если вы хотите автоматически удалить предыдущую версию.

Сначала немного справочной информации о таинственных «кодах». Есть 3 кода (GUID), связанных с MSI:

  1. Код пакета - определяет конкретную версию установщика MSI и никогда не должен использоваться повторно в разных сборках. Его всегда нужно обновлять.
  2. Код продукта - этот идентификатор используется для идентификации конкретной версии приложения. Автор установщика должен решить, когда назначить новый код продукта.
  3. Код обновления - идентифицирует приложение и не должен изменяться в течение его срока службы.

Код обновления никогда не должен изменяться. Для обновления Scenerio код продукта должен быть изменен для каждой версии. Кроме того, как вы упомянули, вы должны увеличить номер версии. Код продукта и Код обновления можно найти, выбрав свой проект установки и перейдя в окно свойств. Код пакета скрыт в Studio и всегда будет обновляться.

Элемент, который вам, вероятно, не хватает, заключается в том, что вам также необходимо установить для параметра RemovePreviousVersions в окне свойств значение true.

person Mike Ohlsen    schedule 04.02.2009

Еще одна вещь в дополнение к ответу Мольсена (для Visual Studio 2008):

Чтобы ваш основной вывод (ваш EXE!) Обновлялся должным образом, вы должны увеличить ВЕРСИЯ ФАЙЛА

Этот параметр можно найти в свойствах проекта: вкладка приложения -> информация о сборке.

person Community    schedule 02.10.2009
comment
Ага - все было правильно настроено. В конце концов отказались от этого и прибегли к тому, чтобы мастер сделал удаление с последующей новой установкой, если он уже обнаружил более старую версию на месте. Кажется, работает нормально и позволяет конечным пользователям обновляться без необходимости вручную возиться с чем-либо. - person PD.; 02.10.2009
comment
Кроме того, насколько я могу судить, MSI, созданные Visual Studio, очевидно, печально известны тем, что не позволяют вам в любом случае обновлять службы, поэтому, выполнив работу в мастере, я, похоже, избежал следующей ловушки. - person PD.; 02.10.2009
comment
+1, но для полной ясности здесь говорится об обновлении файловой версии проекта MAIN (а не проекта установки!). - person Guy Hollington; 11.10.2013

Более простой способ справиться с этим - УДАЛИТЬ AssemblyFileVersion из всех сборок, включая основной исполняемый файл и все управляемые библиотеки DLL.

Я рекомендую сделать что-то подобное в каждом из ваших файлов AssemblyInfo.cs, если вас не интересуют номера версий, но вы хотите иметь некоторую прослеживаемость.

[assembly: AssemblyVersion("1.1.*")]
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")]

Все по-прежнему компилируется нормально, и если у вас не определен AssemblyFileVersion, то установщик предполагает, что каждый раз все меняется (что, вероятно, нормально, если вы устанавливаете все библиотеки DLL рядом с основным EXE).

Я долго разбирался в этом, особенно если я не хочу ничего увеличивать вручную!

person Mark Lakata    schedule 25.05.2011