我有一个包含六个不同功能的 MSI。通过 MSI 安装的软件在分布式环境中运行(每个功能都可以安装在不同的机器上,从单台机器上运行,或任何组合)。我正在创建一个更新例程,如有必要,它将协调所有不同机器的更新。例程的第一阶段是更新我的数据库模式(MSI 功能之一)。如果更新成功,我会继续更新剩余的功能。有没有办法使用 C# 来使用 MSI 数据库来确定功能的安装状态?基本上,我想在每台机器上运行检查并确定哪台机器安装了数据库功能。
问问题
947 次
1 回答
1
首先,我真的不明白你为什么需要所有这些。如果您使用的是次要升级,则将重新安装相同的功能和组件,除非您另行指定或使用传递/条件组件。在 MajorUpgrade 期间,您可以告诉 UpgradeTable 条目迁移功能状态,您将获得与以前相同的功能。所以 MSI 应该只在每台机器上运行并且简单地工作。
也就是说,如果您想使用 C# 检测功能状态,请获取 Windows Installer XML (WiX) 并查看 Deployment Tools Foundation (DTF)。DTF 有一个名为 Microsoft.Deployment.WindowsInstaller.dll 的 Windows Installer 互操作库,您可以像这样使用它:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ProductInstallation productInstallation = new ProductInstallation("{4500F118-6DC7-4A77-94BF-F2409486D8E1}", null, UserContexts.Machine);
foreach (var feature in productInstallation.Features)
{
Console.WriteLine("{0} is {1}", feature.FeatureName, feature.State.ToString());
}
Console.WriteLine("Finished");
Console.Read();
}
}
}
IWD_GENERALINFORMATION 是本地的
IWD 是本地的
IWD_NAMESPACES 是本地的
IWD_PROPERTIES 是本地的
IWD_FILESANDFOLDERS 是本地的
IWD_CUSTOMTABLES 是本地的
IWD_XMLEDITOR 是本地的
IW 是本地的
ISWIXADDIN 是本地的
IWD_SERVICES 不存在
IWD_SHORTCUTS 不存在
完成的
于 2013-10-08T18:27:02.287 回答