Как я могу сделать MSI перезаписать старые файлы? - PullRequest
3 голосов
/ 23 марта 2009

У меня есть стандартный проект установки приложения Visual Studio (2008), который генерирует msi, содержащий несколько файлов. Однако я заметил, что: 1) Когда msi устанавливается и некоторые файлы уже существуют, они просто молча игнорируют эти файлы. Это поведение, которое я не хочу по понятным причинам. 2) Когда я удаляю MSI, он не удаляет мой основной файл DLL.

Как я могу исправить эти две вещи? Вместе они делают невозможным автоматическое обновление моего программного обеспечения.

Ответы [ 6 ]

4 голосов
/ 23 марта 2009

У меня была точно такая же проблема, и в конце концов я сдался. Заставить его работать - ужасный, сложный процесс, включающий множество GUID. После этого вы будете чувствовать себя очень грязно (если вы когда-нибудь заставите его работать).

Мой совет - перейти на Inno Setup, которая больше подходит для таких людей, как вы и я.

Оставьте .msi людям, которые выполняют «корпоративные развертывания» вместо «установки».

3 голосов
/ 23 марта 2009

Вы увеличили номер версии в вашем проекте установки? Увеличение номера версии также попросит вас создать новый идентификатор продукта. Вы должны подтвердить этот вопрос с да.

2 голосов
/ 10 августа 2012

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

То, что мои более новые файлы, которые не перезаписывали существующие, были версионными (они были DLL), и номера версий файлов не изменились, хотя даты изменения были позже. Как только я изменил номер версии файла в более новых файлах, чтобы он был более высокой версией, чем существующие файлы, то существующие файлы были перезаписаны MSI.

А затем были другие файлы, такие как .manifest и .vsto, которые были сгенерированы Visual Studio, и эти файлы не версионные и обычно следуют правилам установки версий установщика. Все они на самом деле относятся к DLL-файлу, и предоставленный атрибут CompanionFile, ссылающийся на эту DLL, для каждого из файлов .manifest, .vsto и т. Д. Сделал свое дело.

1 голос
/ 03 августа 2011

Другой вариант - включить номер версии в папку установки приложения.
Укажите для папки приложения значение по умолчанию:

[ProgramFilesFolder]\\[ProductName]\\[ProductVersion]

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

1 голос
/ 25 марта 2009

Поскольку не удаляются все файлы, проверьте количество ссылок в [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs]

Если вы использовали MSIZAP или «Утилиту очистки установщика Windows», вы фактически переводите компьютер в неизвестное состояние, и вам необходимо вручную удалить все данные из реестра (в моей компании у нас есть утилита при этом удаляются все известные записи реестра из последних 10 выпусков продукта, в основном состоящие из 1000-строчного файла .reg и некоторых других инструментов), прежде чем вы снова сможете надежно протестировать настройки.

См. http://robmensching.com/blog/posts/2009/3/6/More-on-Haacks-Troubleshooting-Windows-MSI-Installers для получения дополнительной информации о том, что происходит, когда вы переводите вашу машину в «неподдерживаемое состояние», и о том, как вам нужно вручную очистить вещи или переформатировать, прежде чем продолжить.

Мы столкнулись с этой проблемой, так как Installshield автоматически по умолчанию устанавливает компоненты в качестве общих компонентов, поэтому в результате мы получаем странные ошибки подсчета ссылок, оставленные файлы и т. Д. И т. Д. Действительно уродливое решение.

Для ваших обновлений, попробуйте делать крупные обновления, а не незначительные обновления (патчи), так как это много легче разобраться, когда вы впервые попадаете в установщик Windows. Но сначала вам нужно правильно удалить приложение, а затем перейти к обновлению. Если он не будет удален должным образом, он не будет обновляться должным образом.

0 голосов
/ 01 февраля 2012

Другой вариант - программно удалить текущее приложение и установить новый MSI. однако для этого потребуется пользовательское приложение winforms

...