在使用wix安装服务之前,如何等待安装到GAC的文件

时间:2015-07-09 10:14:40

标签: wix components serviceinstall paraffin

我正在使用Wix创建我的应用程序安装程序并使用它在GAC中安装程序集,它运行正常。

我的问题是,当我设置汇编属性时,复制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 个答案:

答案 0 :(得分:2)

所有文件和Dll都是在服务启动时安装的。使用Orca在InstallExecuteSequence中查找MSI文件(或查看详细日志),您将看到InstallServices和StartServices位于InstallFiles之后。

问题是在安装FinalFinalize之前,GAC中没有安装和提供程序集,这在此处描述:

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

其中显示“这意味着您无法使用ServiceControl表来启动服务,而是必须使用在InstallFinalize之后排序的自定义操作。”这是你需要做的。