Используемые файлы не обновляются установщиком MSI (проект установщика Visual Studio)
Я использую расширение Visual Studio Installer Projects для сборки MSI-установщика для моего приложения. Тем не менее, мое приложение должно работать постоянно, и если оно открыто, когда пользователь устанавливает новую версию моего программного обеспечения, открытые файлы не перезаписываются, и на самом деле очень мало или ничего не обновляется (хотя инсталлятор не установлен). -errors).
Я обнаружил, что использование "Пользовательских действий" проекта установщика для запуска скрипта, закрывающего приложение, не помогает, так как ни одно из действий не вызывается до замены файлов.
Есть ли хороший способ убедиться, что открытые / заблокированные файлы завершаются до того, как файлы должны быть перезаписаны?
4 ответа
Это не решение проблемы, а скорее другое решение; тот, который требует наименьшей работы в конце.
Я не использовал "Проекты установщика Visual Studio" для моего установщика. Вместо этого я посмотрел на https://advancedinstaller.com/, который работает без проблем. Такие вещи принимаются во внимание, а настраиваемые действия предоставляют больше возможностей.
Если ваш проект с открытым исходным кодом, вы можете написать им о бесплатной "профессиональной" лицензии с открытым исходным кодом, равной их "профессиональному" плану, который обычно составляет 399 долларов (разовая покупка).
Было бы полезно узнать больше о вашем приложении и о том, как вы выполняете обновление, потому что:
Обычно вы увидите диалоговое окно FilesInUse, в котором говорится, что файлы используются, и пользователю предлагается отключить их, но не в том случае, если при установке ничего не происходит.
Установки Visual Studio не имеют встроенной поддержки для закрытия и перезапуска служб, поэтому, если ваше приложение является службой, вам потребуется дополнительная работа.
Файлы, которые действительно должны быть заменены, предложат пользователю перезагрузиться (если они ранее не были закрыты), чтобы заменить их во время перезагрузки.
Так что, если вы не видите запросов на перезагрузку или диалоговых окон FilesInUse при установке пользовательского интерфейса, тогда происходит что-то еще. Таким образом, вы должны быть уверены, что:
а. Вы действительно выполняете обновление, когда версия проекта установки была увеличена, код UpgradeCode такой же (и код продукта изменяется при увеличении версии проекта установки). Ваши симптомы могут быть результатом того, что обновление не работает, и вы видите только ремонт.
б. Определение "новая версия" состоит в том, что у вас есть обновление, как в., И, версии файлов двоичных файлов были увеличены. Правила перезаписи по умолчанию для установок требуют инкрементных версий файлов, поэтому, если они не были увеличены, вы не увидите обновлений, и Windows не будет пытаться показывать диалоги FilesInUse или перезагружаться, потому что нет файлов, которые нужно заменить.
У нас была эта проблема, и мы решили создать два приложения; пользовательское приложение и приложение обновления. MSI устанавливает оба. Каждое приложение проверяет, нуждается ли другое в обновлении, и, если это так, закрывает другое приложение, загружает средство обновления другого приложения, запускает его и затем перезапускает другое приложение. Кроме того, каждое приложение отслеживает, запущено ли другое приложение, и, если это не так, запускает его.
REBOOT: Как вы устанавливаете этот MSI? Какая командная строка? Если вы установите REBOOT=ReallySuppress
в командной строке вам не будет предложено перезагрузить компьютер, даже если он необходим для завершения установки продукта.
msiexec.exe /i MySetup.msi /QN REBOOT=ReallySuppress
Если вы используете систему распространения, я думаю, что подавление запросов на перезагрузку может быть стандартным поведением. Затем файлы вашего продукта должны быть установлены после перезагрузки (PendingFileRenameOperations
или, возможно, какой-то более новый механизм).
Также возможно, что установочные проекты Visual Studio делают что-то странное, чего я не знаю.
Журнал: Я бы попытался создать хороший файл журнала для установки, чтобы определить, что происходит:
msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log
Записывать все MSI: лично мне нравится включать ведение журнала для всех установок MSI - как описано в Globally for all setups on a machine
раздел в приведенной выше ссылке.
Интерпретация журнала MSI: интерпретация файла журнала иногда может быть сложной задачей. Вот ответ с некоторыми ссылками, чтобы помочь с этим.
Диспетчер перезагрузки: управление перезагрузкой - очень сложная тема, и функциональные возможности Windows - в форме функции диспетчера перезапуска - пытаются свести к минимуму необходимость перезагрузок, вместо этого закрывая и перезапуская приложения как часть установки в "авто" -магическая "мода" (приложение слушает сообщения и корректно отключается, когда ему это сказано, и система может перезапустить приложение после установки - если это настроено).
Обновление приложения для соответствия диспетчеру перезапуска - единственное реальное решение для таких проблем, которые вы видите, по моему мнению.
The section "Restart Manager" in this question tries to summarize how to implement such support
(может быть, просто прочитайте желтый раздел немного вниз по странице).- У ребят из http://www.advancedinstaller.com/ есть очень хорошая техническая статья об этом:
How do I add support for Windows Restart Manager to my application?
Также ссылка на ссылку прямо выше - все же стоит прямая ссылка здесь, я думаю.
По ссылке ниже
"В установках VS нет хорошей поддержки для остановки и запуска служб. Проблема в том, что во время установки настраиваемые действия запускаются после того, как все установлено, поэтому уже слишком поздно останавливать службу, которую вы обновляете или заменяете. Да, у них есть такие имена, как "BeforeInstall", но их действительно нет перед установкой ".