Как дождаться установки файла в GAC перед установкой сервиса с помощью wix

Я использую Wix для создания установщика приложения и использую его для установки сборки в GAC, и он работает нормально.

Моя проблема заключается в том, что когда я устанавливаю свойство сборки 'copy local = false' и выполняю установку, мои службы не устанавливаются, потому что не удается найти эту dll в локальной папке и она не устанавливается в GAC еще.

Если я установлю другой компонент из установки EXE и проверим, что DLL находится в GAC, я смогу установить службу.

Я использую Paraffin.exe, чтобы обойти весь каталог приложений и создать файл wix, а также использовать файл Mold, чтобы добавить компонент не из этого каталога.

<DirectoryRef Id="Manager">
    <Component Id="NlogGACRegisterComponent" Guid="1B224CD1-6EE8-46D3-9335-A84B7D8FB87B">
        <File Id="NlogDLL" Name="Nlog.DLL" Source="..\Logging\Nlog.DLL"  KeyPath="yes" Vital="yes" Assembly=".net"/>   
    </Component>
    <Component Id="ManagerServiceComponent" Guid="EA31E161-4331-4A82-8F2B-7E26F62C96D6">
        <File Id="StateManagerServiceEXE" Name="ManagerHostService.exe" DiskId="1" Source="..\ManagerHostService.exe"  KeyPath="yes" Vital="yes" />
        <ServiceInstall Id="ServiceInstaller" Type="ownProcess" Name="ManagerHostService" DisplayName="Manager Service" Description="Manager Service" Start="auto"  Account="[SERVICEACCOUNT]" Password="[SERVICEPASSWORD]" ErrorControl="normal">
            <util:PermissionEx User="Everyone" GenericAll="yes" ServiceChangeConfig="yes" ServiceEnumerateDependents="yes" ChangePermission="yes" ServiceInterrogate="yes" ServicePauseContinue="yes" ServiceQueryConfig="yes" ServiceQueryStatus="yes" ServiceStart="yes" ServiceStop="yes" />
        </ServiceInstall>
        <ServiceControl Id="StartService" Start="install" Name="ManagerHostService" Stop="both" Remove="uninstall" Wait="yes" />
    </Component>
  </DirectoryRef>

Это в файле Mold, который отвечает за установку DLL в GAC, а затем в службу.

Как я могу убедиться, что он сначала установит DLL, а затем службу?

1 ответ

Решение

Все файлы и Dll устанавливаются к моменту запуска служб. Посмотрите в своем файле MSI с Orca на InstallExecuteSequence (или посмотрите в подробный журнал), и вы увидите, что InstallServices и StartServices находятся после InstallFiles.

Проблема в том, что сборки не установлены и доступны в GAC до InstallFinalize, это описано здесь:

https://msdn.microsoft.com/en-us/library/aa370063(v=vs.85).aspx

где написано: "Это означает, что вы не можете использовать ServiceControl Table для запуска службы, вместо этого вы должны использовать настраиваемое действие, которое выполняется после InstallFinalize". это то, что вам нужно сделать.

Другие вопросы по тегам