Как мне убедить VS2005 MSI обновить? - PullRequest
6 голосов
/ 04 февраля 2009

У меня есть служба 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 также предлагает вам) фактически лишает возможности обновления вообще, поскольку программа установки не позволит вам выполнить переустановку, если этот код продукта ранее не был установлен.

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

Ответы [ 3 ]

8 голосов
/ 04 февраля 2009

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

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

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

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

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

6 голосов
/ 02 октября 2009

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

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

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

2 голосов
/ 26 мая 2011

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

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

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

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

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

...