2013-10-24 3 views
0

Я создал установщик, который устанавливает службу Windows. Я использовал установщик по умолчанию для Visual Studio в VS 2010.Крючок перед установкой установщика InstallInstall - установщик Windows

Служба доступа и записи в файле базы данных (SQLite) присутствует в установочной папке.

Во время удаления, когда служба остановлена ​​или запущена, служба деинсталлируется без каких-либо ошибок.

Но если программа установки перенесена с версии 1 на 2, а служба предыдущей версии запущена, тогда была показана ошибка «Файл запрашивается некоторыми приложениями. Попробуйте еще раз», поскольку предыдущая служба установки, обращающаяся к DB-файл.

Поэтому перед установкой новой версии мне необходимо остановить предыдущую версию. У меня есть специальный скрипт действий для управления установкой и удалением. Метод BeforeInstall Я написал код, чтобы остановить службу, используя ServiceController. Это может остановить обслуживание.

ServiceController service = новый ServiceController ("SERVICE_NAME");

если (! (Service.Status.Equals (ServiceControllerStatus.Stopped)))

{ 
     service.Stop(); 
     service.WaitForStatus (System.ServiceProcess.ServiceControllerStatus.Stopped); 

    } 

Но еще до того, BeforeInstall метод установки копирует новые версии файлов, заменяющие мои предыдущие версии файлов.

У меня всегда такая же папка установки. Так что, если я пишу код для остановки службы в пользовательском действии BeforeInstall, он все равно будет вызывать ошибку, потому что файл DB, к которому обращается служба предыдущей версии, пытался удалить новую версию. Поэтому я получаю «к файлу обращается некоторое приложение. Повторите попытку ".

Так что мне нужен крючок еще до того, как установщик скопирует файлы в папку установки. Чтобы я мог остановить службу до того, как установщик попытается обновить файл Db.

Любая идея будет оценена по достоинству.

ответ

2

Установщик Windows не имеет понятия «перед установкой». Это абстракция проекта установки и развертывания Visual Studio. Этот тип проекта не смог выявить многие базовые функции установщика Windows, и именно поэтому Microsoft устранила его в VS2012.

Другая концепция, которая не отображается, - это таблицы ServiceInstall и ServiceControl. Вот почему вы вынуждены писать пользовательские действия. Пользовательские действия, которые размещены таким образом (вне вашего контроля), чтобы татуировать процесс MSIEXEC с версией CLR и вызывать модальные 1001 исключения (даже во время бесшумной установки), когда есть проблема.

Но есть решение. Переключитесь на лучший инструмент, такой как бесплатный и открытый исходный код Windows Installer XML (WiX) и Industrial Strength Windows Installer XML (IsWiX). С помощью этих инструментов вы можете создать службу Windows, создать для нее установщик и протестировать установку/удаление на виртуальной машине через 10 минут. Следите за моей тихой демонстрацией по адресу:

Building and Deploying a Windows Service using IsWiX

Смежные вопросы