Восстановление Wix: файлы по-прежнему хранятся в службе, хотя она была остановлена ​​и удалена

При установке Wix для моего служебного приложения я столкнулся с такой проблемой - когда я выбираю вариант «восстановить», после установки мне предлагается перезагрузить мой компьютер. На самом деле моя тестовая установка содержит только два файла. Хотя есть атрибуты, которые заставляют установщик остановить службу (и он фактически останавливает и удаляет службу из-за журнала), файлы все еще заняты процессом службы . Что я делаю неправильно? Есть ли обходные пути? Как в этом случае избавиться от запроса на перезагрузку? вот код установщика:

<Fragment>
        <ComponentGroup Id="ProductComponents" Directory="AGENTFOLD">
            <Component Id="WindowsAgent" Guid="*">
        <File Id="WinAgent" KeyPath="yes" Source="WindowsAgent.exe"/>
        <ServiceInstall Id='WindowsAgentInst' Name='WindowsAgent' DisplayName='WindowsAgent' Type='ownProcess' Account='LocalSystem' Start='auto' ErrorControl='normal'/>
        <ServiceControl Id="WindowsAgentControl" Name="WindowsAgent" Stop="both" Start="install" Remove="uninstall" Wait="yes" />
      </Component>
      <Component Id="cmp2" Guid="GUIDHERE">
        <File Id="fil2" KeyPath="yes" Source="mydll.dll" />
      </Component>
        </ComponentGroup>
    </Fragment>

вот что говорит журнал:

Информация 1603. Файл C: \ Program Files (x86) \ WindowsAgent \ mydll.dll используется. Закройте это приложение и повторите попытку.

MSI (s) (88:78) [17: 01: 50: 993]: Продукт: Setuptest. Файл C: \ Program Files (x86) \ WindowsAgent \ mydll.dll используется следующим процессом: Имя: WindowsAgent, Id 3384.

Информация 1603. Файл C: \ Program Files (x86) \ WindowsAgent \ WindowsAgent.exe используется. Закройте это приложение и повторите попытку.

MSI (s) (88:78) [17: 01: 51: 182]: Продукт: Setuptest. Файл C: \ Program Files (x86) \ WindowsAgent \ WindowsAgent.exe используется следующим процессом: Имя: WindowsAgent, Id 3384.

Обратите внимание: если я остановлю обслуживание вручную перед ремонтом, все будет работать нормально.


person Nick B    schedule 27.03.2015    source источник


Ответы (1)


Вот некоторые из распространенных причин:

  1. Служба может быть «остановлена» в том смысле, что протокол службы завершен и процесс больше не работает как служба, но процесс все еще выполняется и не завершен. Обслуживаемая остановка! = Процесс прекращен. Так что это вопрос времени, и если много чего происходит, может потребоваться некоторое время, чтобы процесс ушел и выпустил библиотеки DLL. Этого не происходит, когда вы закрываете службу вручную, потому что никого не волнует, требуется ли время для завершения процесса. Установка / удаление - это гонка между завершением процесса и желанием Windows избавиться от используемых Dll. Сервис может вести себя некорректно, не могу исключить этого.

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

person PhilDW    schedule 27.03.2015
comment
Спасибо за ответ, это очень полезно! Поэтому я думаю, что я должен добавить настраиваемое действие после остановки службы, чтобы проверить состояние процесса и дождаться его завершения. - person Nick B; 30.03.2015
comment
Возможно, или если вы владеете кодом службы, возможно, сделайте запись в журнале событий, когда служба перестает быть службой, и в качестве самого последнего действия, которое процесс делает при выходе. Это может указывать на временную гонку, если вы сравните его с журналом MSI, и проверка кода службы в любом случае может быть полезна, чтобы увидеть, что он делает после того, как перестает быть службой. Много кода очистки? - person PhilDW; 30.03.2015