1

我有的:

  1. 通过 msi-package 推出服务的目的(在 services.msc 中列出)
  2. 该服务正在使用自定义 dll
  3. 带有自定义操作的 InstallExecuteSequence
    • <... After="InstallFinalize">NOT Installed</Custom>用于安装
    • <... Before="InstallInitialize">Installed</Custom>用于卸载
  4. 到目前为止,该服务是在工作站上手动安装的,没有 msi 包,也没有注册为应用程序(所以它没有显示在 appwiz.cpl 中)

有什么问题:

  • 如果服务(来自以前的安装)正在运行,我不知道在复制文件之前如何停止它(当然,更新 dll 的基本要求是没有任务正在使用它们)
  • 即使服务(来自以前的安装)没有运行,也没有文件被更新

所以我想要什么:

  • 我只是想用我的全新 msi 包和更新的 dll 和所有这些东西覆盖 4) 中的现有安装

有什么解决办法:

是的,希望它尽快出现在我的文字下方:)也许标题不是很好,那是因为我不知道如何走得更远......

4

2 回答 2

1

让您摆脱困境的最简单方法是编写一个安装程序,该安装程序使用 ServiceInstall 和 ServiceControl 元素(使用 Both 值删除属性)来定义服务。将文件定位到以前未使用过的新目录,这样您的引用计数就不会全部混乱。使用 RemoveFile 元素删除旧安装的文件是一个很好的措施。目标是能够升级删除折叠文件并卸载所有内容。

如果旧文件没有一致地部署到同一目录,您要么必须提供已知目录列表并编写重复的 RemoveFile 语句,要么编写搜索文件并删除它们的自定义操作。(次优)

于 2012-05-31T17:42:04.117 回答
0

ServiceControl 元素:很酷,但我遇到了类似的问题:如果在运行 msi-package 时之前(手动)安装的服务仍在运行,则会弹出一个窗口询问要做什么(停止服务、取消、..)。

我最终将卸载旧版本的担忧与新的安装例程分开。我简单地写了一个批处理脚本,它在 msi 包运行之前运行。

于 2012-06-29T13:34:28.113 回答