使用MSI数据库检测功能状态

时间:2013-10-07 14:42:39

标签: windows-installer

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

1 个答案:

答案 0 :(得分:1)

首先,我真的不明白为什么你需要这一切。如果您使用次要升级,则将重新安装相同的功能和组件,除非您另行指定或使用传递/条件组件。在MajorUpgrade期间,您可以告诉您的UpgradeTable条目迁移功能状态,您将获得之前获得的相同功能。所以MSI应该只在每台机器上运行,只需工作即可。

也就是说,如果要使用C#来检测功能状态,请获取Windows Installer XML(WiX)并查看部署工具基础(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 is Local

     

ISWIXADDIN是本地

     

IWD_SERVICES缺席

     

IWD_SHORTCUTS缺席

     

成品