2

在我的 wix 中,我使用以下声明:

<ComponentGroup Id="BinComponents" Directory="BIN">
  <Component Id="BinComponent" Guid="23D229D0-06EE-49f4-80B4-6D7136500721">

    <File Id="MyProjectOutput" Name="MyProject.exe" Source="MyProject\bin\MyProject.exe"/>
    <ServiceControl Id="RemoveService"
       Stop="both"
       Remove="both"
       Name="MyProject.exe"
       Wait="yes" /> <!-- Stop running MyProject instances -->

  </Component>
</ComponentGroup>

我的复制:

首先,我像往常一样运行我的安装。安装后,我启动我的 Web 应用程序。.exe 像往常一样出现在任务管理器中:

在此处输入图像描述

我想在修复、更新或卸载时结束这个 .exe。所以我再次启动我的 .msi 并选择修复:

在此处输入图像描述

现在我的问题:按“修复”后,由于声明了以下对话框,我希望出现以下对话框ServiceControl

在此处输入图像描述

但事实并非如此。相反,会出现以下对话框:

在此处输入图像描述

当我记录设置时,日志显示以下几行:

MSI (s) (A8:DC) [10:16:28:227]: Executing op: ActionStart(Name=StopServices,Description=Stopping services,Template=Service: [1])
Action 10:16:28: StopServices. Stopping services
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ProgressTotal(Total=1,Type=1,ByteEquivalent=1300000)
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ServiceControl(,Name=MyProject.exe,Action=2,Wait=1,)
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ActionStart(Name=DeleteServices,Description=Deleting services,Template=Service: [1])
Action 10:16:28: DeleteServices. Deleting services
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ProgressTotal(Total=1,Type=1,ByteEquivalent=1300000)
MSI (s) (A8:DC) [10:16:28:229]: Executing op: ServiceControl(,Name=MyProject.exe,Action=8,Wait=1,)
MSI (s) (A8:DC) [10:16:28:229]: Executing op: ActionStart(Name=InstallFiles,Description=Copying new files,Template=File: 
[1],  Directory: [9],  Size: [6])

[...]

MSI (s) (7C:28) [09:06:21:950]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.
MSI (s) (7C:28) [09:06:21:950]: Note: 1: 1610 
MSI (s) (7C:28) [09:06:21:950]: Note: 1: 2205 2:  3: Error 
MSI (s) (7C:28) [09:06:21:950]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1610 

在修复旁边,我还尝试了具有相同结果的更新。也许缺少任何声明?注意:当我在任务管理器中关闭 MyApp.exe 时,没有出现该消息,因此 MyApp.exe 肯定是问题的原因。

4

2 回答 2

1

您应该在某处发布整个日志。根本原因是修复不应该经常要求替换文件。因此,如果您确实安装了产品,运行了 exe,然后需要修复以替换文件,那么问题不在于使用中的文件对话框 - 而是安装的产品已损坏,因此所需的文件或注册表项已经删除。应用程序事件日志应包含描述缺少组件的 MsiInstaller 条目。因此,首先查看根本原因。

修复后需要替换文件的修复应该是非常罕见的,因此可能不值得担心。但是您可以考虑将您的应用程序与 Restart Manager 集成或使用 WiX util CloseApplication。

于 2015-07-02T18:14:31.830 回答
1

您看到的警告对话框来自“InstallValidate”标准操作。我过去也遇到过类似的问题。我通过对相同的服务 id使用单个服务控制元素而不是多个服务控制元素来修复它。就我而言,我有多个服务控制元素用于相同的服务 ID。

这是根据 http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Upgrade-uninstall-restart-issue-td7586315.html上的链接

这对我有用。许多用户报告了相同的行为,尽管它没有正式记录。拥有单个服务控制元素会使重新启动管理器记下服务控制表中的条目,并阻止重新启动管理器在 RMFilesInUse 对话框中列出服务,或者阻止重新启动管理器抛出警告消息,通知用户可能会重新启动需要。这是另一个链接 Can't start windows service with WiX

我的实验表明,服务控制元素的数量和重新启动管理器之间存在明确的联系 http://microsoft.public.windows.msi.narkive.com/OOuQQAsw/controlling-restart-manager-behaviour

另一个选项是使用属性 RESTARTMANAGERCONTROL 完全禁用 Restart Manager,如果禁用 RestartManager,系统可能会提示您重新启动(您可能想测试一次),并且旧的“正在使用的文件”机制启动。禁用重新启动管理器是相关 msi 开发人员有意识的决定,有时是必要的。

我不确定您的服务控制表是什么样的。只是想和你分享我的经验。

希望它有所帮助。

问候, 基兰·赫格德

于 2015-07-06T06:31:17.790 回答