Как заставить MSI Installer запускать некоторый код при удалении службы - PullRequest
0 голосов
/ 02 мая 2018

У меня проблемы с некоторыми из них, которые я хотел бы выполнить, когда служба будет удалена. Я добавил код как для события System.ServiceProcess.ServiceProcessInstaller BeforeUninstall, так и для
переопределить метод OnBeforeUninstall, но это тоже не сработало.

При использовании моего InstallShield msi для удаления службы этот код не выполняется.

Как заставить службу запускать некоторый код во время удаления? Нужно ли использовать другое событие в моей службе C #? Нужно ли что-то менять в моем MSI?

Примечание: Моя проблема идентична следующей https://community.flexerasoftware.com/showthread.php?149176-MSI-Uninstall-NET-Service-does-not-launch-BeforeUninstall-event

Спасибо, Сагар

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

.NET Installer Class : PhilDW уже сказал все это, но я просто хочу добавить пару вещей. Я предполагаю, что вы используете System.Configuration.Install.Installer и ServiceProcessInstaller Class (в файле справки Installshield есть образец ). Раньше был (и я думаю, что он есть) флаг для каждого компонента Installshield, который называется .NET Installer Class. Вы можете установить этот флаг на Yes, и тогда я полагаю, что сам Installshield позаботится о запуске методов вашего класса установщика (Install, Commit, Rollback, Uninstall - какой бы ни реализован, я думаю, но я никогда не проверял все сценарии. I не используйте эту функцию).

InstallUtil.exe : запуск InstallUtil.exe действительно вызовет эти методы. Я не уверен, как Installshield вызывает методы изнутри (во время выполнения установки) - они могут фактически вызывать InstallUtil.exe, насколько мне известно, или какой-то более низкоуровневый вызов API.

Заключение : просто перейдите в компонентное представление и щелкните по компоненту, содержащему ваш service.exe файл - и установите флаг, упомянутый выше. Exe должен быть файлом ключа для рассматриваемого компонента - и это должна быть сборка .NET. Как писал PhilDW, Я бы не использовал эти методы , поскольку они предназначены для использования только при разработке сервиса, а не при развертывании . Во-первых, вы можете столкнуться с ошибками выполнения , когда методы пытаются запустить сбои всей вашей установки (и часто излишне), и также есть вероятные проблемы с откатом и потенциально другие проблемы . Можем ли мы спросить, что на самом деле делают методы? Возможно, вы просто удаляете некоторые файлы журналов? Есть и другие способы сделать это - наиболее существенно с помощью таблицы RemoveFile .

0 голосов
/ 02 мая 2018

Вы должны быть более точными во всем, что вы сделали Например, нет автоматического вызова методов класса установщика, если они явно не добавлены в вашу настройку как пользовательские действия (в вашем случае удаление пользовательского действия). Вы также должны объяснить, как именно была установлена ​​служба.

Обратите внимание, что классы установщика были изобретены установками Visual Studio, и, как правило, их не нужно использовать, поскольку такие инструменты, как InstallShield, обычно поддерживают стандартные функциональные возможности ServiceInstall и ServiceControl в установщике Windows. Установочные классы не нужны. Кроме того, эти события являются специальными событиями Visual Studio, и мне не ясно, поддерживает ли InstallShield их. Если вы используете метод удаления для удаления службы, просто добавьте свой код «до» перед вызовом Base.Uninstall ().

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

...