Как мне убедить VS2005 MSI обновить?
У меня есть служба 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 ответа
Есть несколько вещей, которые необходимо сделать, чтобы "обновления" работали с MSI, если вы хотите автоматически удалить предыдущую версию.
Сначала некоторая справочная информация о загадочных "кодах". Существует 3 кода (GUID), связанных с MSI:
- Код пакета - определяет конкретную версию установщика MSI и никогда не должен использоваться повторно во всех сборках. Это всегда должно быть обновлено.
- Код продукта - этот идентификатор используется для идентификации конкретной версии приложения. Автор установщика должен решить, когда назначать новый код продукта.
- Код обновления - это идентифицирует приложение и не должно меняться в течение срока его службы
Код обновления никогда не должен изменяться. Для обновления scenerio код продукта должен быть изменен для каждой версии. Кроме того, как вы упомянули, вы должны увеличить номер версии. Код продукта и код обновления можно найти, выбрав проект установки и перейдя в окно "Свойства". Код пакета скрыт в Studio и всегда будет обновляться.
Элемент, который вы, вероятно, пропустили, заключается в том, что вам также нужно установить для параметра RemovePreviousVersions в окне свойств значение true.
Еще одна вещь в дополнение к ответу Мохлсена (для Visual Studio 2008):
Для того, чтобы ваш основной выход (ваш EXE!) Обновился должным образом, вы должны увеличить ФАЙЛ ВЕРСИИ.
Этот параметр можно найти в свойствах проекта: вкладка "Приложение" -> "Информация о сборке".
Более простой способ справиться с этим - УДАЛИТЬ AssemblyFileVersion из всех сборок, включая основной исполняемый файл и все управляемые библиотеки DLL.
В каждом из ваших файлов AssemblyInfo.cs я рекомендую делать что-то подобное, если вы не заботитесь о номерах версий, но хотите иметь возможность отслеживания.
[assembly: AssemblyVersion("1.1.*")]
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")]
Все по-прежнему хорошо компилируется, и если у вас не определен AssemblyFileVersion, тогда установщик предполагает, что все каждый раз меняется (что, вероятно, хорошо, если вы устанавливаете все библиотеки DLL рядом с основным EXE-файлом).
Я потратил много времени, чтобы понять это, особенно если я не хочу увеличивать что-либо вручную!