在Windows上强制实现互斥安装?

时间:2012-11-01 14:13:51

标签: windows wix windows-installer installshield

我们有产品A和产品A'。它们几乎完全相同,容易混淆。出于法律原因,有必要保持这些微妙的不同。由于技术原因,两者不可能共存并正确运行。因此,如果已安装产品A',我们希望阻止用户安装产品A,反之亦然。

在Windows上执行此操作是否有最佳做法?

我最初的想法是为产品A和A'使用不同的升级代码,并使用它来表明另一个已安装,但我确信还有其他方法和/或最佳实践。

3 个答案:

答案 0 :(得分:3)

您可以使用自定义操作来枚举已安装产品的列表。

//using using Microsoft.Deployment.WindowsInstaller;

IEnumerable<ProductInstallation> installedProducts = ProductInstallation.GetProducts(null, null, Microsoft.Deployment.WindowsInstaller.UserContexts.Machine);
foreach (ProductInstallation installedProduct in installedProducts)
    {
        if (installedProduct.ProductName == "Name of Product A'")
        {
            // set some property in your installer to indicate the product can't be installed
        }
    }

答案 1 :(得分:2)

我之前没有做过,但解决方法是在安装(第一次)产品A(或A')时在Windows注册表上存储键值。

每次A(或A')的安装程序运行时,它会检查该密钥是否存在,如果为true则中止安装,否则继续安装。 请记住,如果用户卸载了产品,那么也要删除注册表中的密钥。

有关Windows注册表的更多信息:http://en.wikipedia.org/wiki/Windows_Registry

有关添加,修改,删除密钥的信息:http://support.microsoft.com/kb/310516

答案 2 :(得分:2)

我相信Windows Installer程序包开发人员无需借助Using Properties in Conditional Statements的自定义操作即可完成此操作。

LaunchConditions action查询LaunchCondition table并评估其中记录的每个条件语句。如果这些条件语句中的任何一个失败,则会向用户显示一条错误消息,并终止安装。

LaunchConditions操作通常是序列中的第一个,但AppSearch Action可能会在LaunchConditions操作之前排序。

AppSearch操作使用文件签名来搜索现有版本的产品。 AppSearch操作还可用于将属性设置为注册表或.ini文件条目的现有值。

安装程序第一次在建议的位置找到文件签名时,它会停止搜索此文件或目录,并在AppSearch Table中设置相应的属性。然后可以使用LaunchCondition表中的Conditional Statement Syntax来评估该属性。