使用InstallShield LE安装程序获取C#应用程序的版本信息

时间:2014-01-20 03:14:10

标签: c# versioning installshield installshield-le

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

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

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

思想??

感谢您的建议!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

按顺序,这些更改的可能性比之前的更少,并且让安装程序将其版本写入选定的注册表位置(将[ProductVersion]放入注册表项的值)应该是微不足道的)所以这是我的建议。然后,唯一需要的更新是在更新安装时更改ProductVersion

还有一种方法可以在没有任何特殊先验知识的情况下发挥作用。我将在Win32 API中进行描述,因为我对DTF包装器不够熟悉:

  1. 使用MsiEnumComponentsMsiEnumComponentsEx查看计算机上所有已安装的组件 - 这可能需要一段时间
  2. 使用MsiEnumClientsMsiEnumClientsEx标识安装每个组件的产品(或多个产品)
  3. 在每个产品 - 组件对上使用MsiGetComponentPathMsiGetComponentPathEx来确定该对是否安装了您的exe文件(您当前运行的位置)
  4. 使用MsiGetProductInfoMsiGetProductInfoEx检索ProductVersion;如果有多个客户端,则必须决定如何处理它 - 可能使用最大版本
  5. (如果您对UpgradeCode进行硬编码,则可以使用MsiEnumRelatedProducts代替步骤1-3;如果您对ProductCode进行硬解,则可以直接跳到第4步。通常,您只需要如果您需要搜索每个用户的安装,请调用Ex变体。)