Windows installer 根据情况安装不同版本的程序

Windows installer 根据情况安装不同版本的程序,windows-installer,Windows Installer,我正在构建一个MSI软件包,该软件包应安装特定可执行文件的多个版本之一,具体取决于Windows版本(即,一个在Windows Vista中使用新功能,另一个自行执行) 无论安装了哪个版本,可执行文件的名称都应该相同(否则这将是微不足道的,不是吗?) 使用Windows Installer实现这一点的正确方法是什么?实现这一点的绝对最佳方法是使EXE文件能够检测其自身的操作环境,并根据操作系统提供的内容选择不同的方法,以便只处理一个二进制文件 原因有很多: 一个单独的二进制几乎就像一个双代码库

我正在构建一个MSI软件包,该软件包应安装特定可执行文件的多个版本之一,具体取决于Windows版本(即,一个在Windows Vista中使用新功能,另一个自行执行)

无论安装了哪个版本,可执行文件的名称都应该相同(否则这将是微不足道的,不是吗?)


使用Windows Installer实现这一点的正确方法是什么?

实现这一点的绝对最佳方法是使EXE文件能够检测其自身的操作环境,并根据操作系统提供的内容选择不同的方法,以便只处理一个二进制文件

原因有很多:

  • 一个单独的二进制几乎就像一个双代码库,因为它必须为每个版本进行完整的、单独的QA,并且通常更容易调试和修复单个二进制
  • 不同的二进制文件可能导致修补和升级问题,众所周知,这些问题很难调试和修复
  • 如果对同名的不同文件使用相同的安装位置,则安装程序将无法通过windows installer验证。这通常不是问题,除非您的安装程序需要获得Microsoft的认证
  • MSI在部署同一文件的不同版本时显得笨重

如果您必须部署两个二进制文件,我将使用EXE文件的另一个副本创建一个新组件,并使用不同的文件名或相同的文件名安装它,但安装在不同的安装文件夹中。然后,通过使用windows installer条件,将具有文件的组件设置为相互排斥的安装条件。这将允许正确的修补和升级。

此外,如果用户从XP升级到Vista-现在您安装了“错误”的二进制文件。这可以通过“修复”安装来修复。我的观点是,我宁愿避免现在不得不延迟绑定DLL所带来的复杂性,这样我的二进制文件就可以在XP上加载而不需要它们。我认为有编译器标志可以为您处理将逻辑构建到EXE中的过程,但我不确定。值得一问C++问题?由于这与加载行为有关,因此可能无法放入EXE,但Windows确实具有二进制文件的“兼容性标志”(请参见Windows资源管理器中文件的“属性”选项卡中的“兼容性”选项卡)。您是否可以启用此标志来强制加载行为,或者启用Windows兼容性功能来帮助您避免自己遇到麻烦?Simon,在这种情况下,还记得为具有条件的组件设置瞬态属性。否则,修复可能无法将正确的文件放回。这正是我们的想法——让临时组件相互排斥,并根据安装的Windows版本进行定制。对于运行良好的COM组件,因为操作系统和用户都不太关心DLL的命名方式(我从SDK MSI中窃取了这个想法,我认为这在某种程度上是正确的);这只会在从命令行调用可执行文件时变得困难。