我们有产品 A 和产品 A'。它们几乎相同,很容易混淆。出于法律原因,有必要保持这些微妙的不同。由于技术原因,两者不可能共存并正确运行。因此,如果已经安装了产品 A',我们希望阻止用户安装产品 A,反之亦然。
是否有在 Windows 上强制执行此操作的最佳实践?
我最初的想法是为产品 A 和 A' 使用不同的升级代码,并使用它来提示另一个已安装,但我确信还有其他方法和/或最佳实践。
我们有产品 A 和产品 A'。它们几乎相同,很容易混淆。出于法律原因,有必要保持这些微妙的不同。由于技术原因,两者不可能共存并正确运行。因此,如果已经安装了产品 A',我们希望阻止用户安装产品 A,反之亦然。
是否有在 Windows 上强制执行此操作的最佳实践?
我最初的想法是为产品 A 和 A' 使用不同的升级代码,并使用它来提示另一个已安装,但我确信还有其他方法和/或最佳实践。
我相信 Windows Installer 程序包开发人员能够通过Using Properties in Conditional Statements来做到这一点,而无需借助自定义操作。
LaunchConditions操作查询LaunchCondition 表并评估其中记录的每个条件语句。如果这些条件语句中的任何一个失败,则会向用户显示一条错误消息并终止安装。
LaunchConditions 操作通常是序列中的第一个,但AppSearch 操作可能在 LaunchConditions 操作之前排序。
AppSearch 操作使用文件签名来搜索产品的现有版本。AppSearch 操作还可用于将属性设置为注册表或 .ini 文件条目的现有值。
安装程序第一次在建议的位置找到文件签名时,它会停止搜索此文件或目录,并在AppSearch Table中设置相应的属性。然后可以使用LaunchCondition 表中的条件语句语法评估该属性。
您可以使用自定义操作来枚举已安装产品的列表。
//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
}
}
我以前没有这样做过,但一个解决方案是在安装(第一次)产品 A(或 A')时在 Windows 注册表上存储一个键值。
每次 A(或 A')的安装程序运行时,它都会检查该密钥是否存在,如果为真则中止安装,否则继续安装。请记住,如果用户卸载产品,那么也要删除注册表中的密钥。
有关 Windows 注册表的更多信息:http ://en.wikipedia.org/wiki/Windows_Registry
有关添加、编辑、删除密钥的信息:http: //support.microsoft.com/kb/310516