gpt4 book ai didi

windows - 用于停止和开始运行 Windows 服务的 Wix 自定义操作 - 问题是在哪里调用它们?

转载 作者:可可西里 更新时间:2023-11-01 11:24:36 25 4
gpt4 key购买 nike

我们的安装程序当前“安装”了一个 Windows 服务 exe,即它只是将文件复制到用户的 PC 上,但并不启动它。

然后当我们的应用程序运行时,它将使用 InstallUtil 多次“安装”该服务,并且该服务的每个实例都将具有不同的服务名称。

所以当我们升级我们的应用程序时,我们不知道有多少这些服务正在运行以及它们叫什么 - 但我们知道它们的服务名称将以“ABCService_”开头。

因此,我创建了几个 VB.NET 自定义操作 - 一个称为“stopServices”,一个称为“startServices”。第一个将扫描用户的 PC 以查找以“ABCService_”开头的任何 Windows 服务,并将其名称存储在临时文件夹中的 XML 文件中,同时还有一个说明该服务是否正在运行的属性。然后它将停止每个正在运行的服务。

然后会继续正常安装-windows服务exe会升级等

第二个自定义操作将执行相反的操作 - 它将读取 xml 文件并启动最初运行的任何服务。

现在理论上(在我看来)这应该可行 - 但我遇到的问题是将这些自定义操作放在 wix msi 代码中的什么位置。我目前得到的是:

    <InstallExecuteSequence>
<Custom Action="CA_StopWindowsServices"
After="InstallInitialize" />

<Custom Action="CA_StartWindowsServices"
Before="InstallServices">
<![CDATA[NOT Installed]]>
</Custom>
</InstallExecuteSequence>

因为自定义操作会改变 PC 的状态,所以它们必须放在 InstallExecuteSequence 中,Visual Studio 告诉我停止操作必须在 InstallInitialize 之后,我认为在 InstallServices 之前启动一个可能是个好地方!?

但是 - 这是我的问题 - 当我运行 msi 时; Windows 提示其中一个需要升级的文件(即 Windows 服务 exe)正在被正在运行的服务实例使用——我知道这会是一个问题,因此我编写了自定义操作;但我似乎无法在 Windows 提示它们正在使用之前调用停止它们的那个?!

只是认为了解我如何定义自定义操作可能是相关的:

    <CustomAction
Id="CA_StopWindowsServices"
BinaryKey="CustomActionDLL"
DllEntry="CustomActionStopServices"
Execute="deferred"
Return="check" />

<CustomAction
Id="CA_StartWindowsServices"
BinaryKey="CustomActionDLL"
DllEntry="CustomActionStartServices"
Execute="commit"
Return="check" />

现在说所有这些 - 我刚刚运行了我的 msi,当 Windows 提示 2 个服务实例正在使用需要替换的文件时 - 我选择了第一个选项,这是让 Windows 关闭它们并在最后 - 这基本上就是我想要做的 :) 所以另一个问题是 - 我是否可以告诉 Windows 自动执行此操作 - 而无需询问用户?如果有帮助,msi 实际上是从 burn bootsrapper 运行的。

非常感谢。

干杯,

大克里斯。

最佳答案

Windows 安装程序检查将被替换的文件是否在 InstallValidate 期间正在使用,InstallValidate 发生在 InstallExecute 序列之前。

问题是,如果您在 InstallValidate(通常)之前安排自定义操作,则需要提升才能停止您没有的服务。

但是,在 Bootstrap 中,您可以安排任务在 InstallValidate 之前停止服务,因为 MSI 始终从您单击安装时启动的提升的 Bootstrap 进程运行。

我没有检查但添加了一个 <ServiceControl> MSI 中的服务可能会在“StopServices”标准操作期间自动停止服务,并且还会避免 InstallValidate 中的 FilesInUse 对话框。我还没有抽出时间来测试这个,因为我已经有了一个可以使用 Bootstrap 的解决方案。

因此请尝试您的自定义操作解决方案,但安排您的自定义操作在 InstallValidate 之前停止服务。

关于windows - 用于停止和开始运行 Windows 服务的 Wix 自定义操作 - 问题是在哪里调用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com