Как дождаться установки файла в 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". это то, что вам нужно сделать.