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