0

我有一个包含六个不同功能的 MSI。通过 MSI 安装的软件在分布式环境中运行(每个功能都可以安装在不同的机器上,从单台机器上运行,或任何组合)。我正在创建一个更新例程,如有必要,它将协调所有不同机器的更新。例程的第一阶段是更新我的数据库模式(MSI 功能之一)。如果更新成功,我会继续更新剩余的功能。有没有办法使用 C# 来使用 MSI 数据库来确定功能的安装状态?基本上,我想在每台机器上运行检查并确定哪台机器安装了数据库功能。

4

1 回答 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 回答