2014-01-20 71 views
0

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

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

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

想法??

我很感谢您的建议!

+0

你不能设置版本到你的主应用程序EXE/DLL和从那里得到它?假设您正在使用每个新版本对应用程序文件进行版本控制,而不仅仅是安装程序。 –

回答

0

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

0

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

  • 有问题的版本,每次你的答案
  • 安装的ProductCode
  • 注册表位置(具体到主要版本)
  • 安装一系列的UpgradeCode
  • 注册表位置(独立于主要版本)

那些按顺序比它之前的更不可能发生变化,并且安装程序将其版本写入选定的注册表位置(将[ProductVersion]置于注册表项的值中)应该很简单,这是我的建议。然后,当您更新安装时,唯一需要更新的是更改ProductVersion

还有一种方法可以在没有任何特殊先验知识的情况下工作。我就勾勒出来的Win32 API的,因为我没有与DTF包装再熟悉不过了:

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

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

相关问题