1

我有一个要使用 InstallSheild LE 部署的 C# 程序。我知道如何制作 setup.exe 文件来安装应用程序,并且我知道如何创建可以升级当前安装的新安装程序。

目前,我让我的应用程序从安装日志中获取其版本号。它检查它的版本号(最初是空字符串)。如果版本号是一个空字符串,应用程序将转到 %TEMP% 目录并读取最新的安装 LOG 文件,查找表明安装成功的行和带有版本信息的行。版本信息保存在应用程序设置中,用于检测是否有可用升级。为了检测更新,它会将其版本号与更新位置(在网络驱动器上)中的 setup.exe 的版本号进行比较。

这个实现有效,但是,这有几个方面让我担心,我想知道是否有更好的方法来告诉应用程序它是什么版本并保存这些信息(最好不要在可以删除的文件中)。显然,信息需要可更新并在运行之间保留。理想情况下,我希望能够在我的 C# 应用程序中内部设置版本号,而不必对正在创建的文件或文件位置等进行假设来获取它。

想法??

我很感激你的建议!

4

2 回答 2

0

我发现最简单的方法是在应用程序中硬编码版本号。然后,我会在程序执行期间检查网络驱动器上更新位置中的安装程序版本。如果网络驱动器中的安装程序版本高于应用程序中的硬编码版本,程序将下载新的安装程序,通过另一个进程执行它,然后关闭应用程序以便更新必要的文件。

于 2014-01-24T00:16:44.373 回答
0

为了做到这一点,除了更新位置之外,您几乎必须硬编码一些东西。那么问题就变成了最好的硬编码。以下是一些想法,假设您的安装ProductVersion属性包含您需要比较的版本:

  • 有问题的版本,根据您的回答
  • 您的ProductCode安装
  • 注册表位置(特定于主要版本)
  • 您的UpgradeCode安装系列
  • 注册表位置(独立于主要版本)

这些,依次,每一个都比之前的更不可能改变,并且让安装程序将其版本写入选定的注册表位置(放入[ProductVersion]注册表项的值)应该是微不足道的,所以这是我的建议。那么唯一需要的更新就是ProductVersion在更新安装时进行更改。

还有另一种方法可以在没有任何特殊先验知识的情况下工作。我将在 Win32 API 中勾勒出来,因为我对 DTF 包装器不够熟悉:

  1. 使用MsiEnumComponentsMsiEnumComponentsEx查看机器上所有已安装的组件 - 这可能需要一段时间
  2. 使用MsiEnumClientsMsiEnumClientsEx来识别安装每个组件的产品(或多个产品)
  3. 在每个产品-组件对上使用MsiGetComponentPathMsiGetComponentPathEx来确定该对是否安装了您的 exe 文件(您当前运行的位置)
  4. 使用MsiGetProductInfoMsiGetProductInfoEx检索ProductVersion; 如果有多个客户端,您将不得不决定如何处理它 - 也许通过使用最大的版本

(如果您硬编码,UpgradeCode您可以使用MsiEnumRelatedProducts代替步骤 1-3;如果您硬编码,您可以ProductCode直接跳到步骤 4。通常,如果您需要搜索每个用户的安装,您只需要调用 Ex 变体。)

于 2014-01-25T15:19:15.130 回答