【问题标题】:Get version information for C# application with InstallSheild LE installer使用 InstallShield LE 安装程序获取 C# 应用程序的版本信息
【发布时间】:2014-01-20 03:14:10
【问题描述】:

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

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

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

想法??

感谢您的建议!

【问题讨论】:

  • 您不能将版本设置为您的主应用程序 EXE/DLL 并从那里获取吗?假设您正在对每个新版本的应用程序文件进行版本控制,而不仅仅是安装程序。

标签: c# versioning installshield installshield-le


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    为了做到这一点,除了更新位置之外,您几乎必须硬编码一些东西。那么问题就变成了最好的硬编码。以下是一些想法,假设您安装的 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变体,如果您需要搜索每个用户的安装。)

    【讨论】:

      猜你喜欢
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多