wix - 如何从MSI "File"表中提取数据(文件计数)

标签 wix windows-installer wix3 orca

在我们的构建过程中,当前有可能将基于非代码的文件(例如图像文件)添加到我们的Web项目中,但不包括在WiX构建的MSI安装程序中。

为了防止这种情况,我想在WiX项目的AfterBuild目标中执行以下操作:

  • 获取所有已构建文件的数量(Web部署项目的输出)
  • 获取内置到MSI中的所有文件的计数(从MSI的"file"表中获取)
  • 比较计数,如果不匹配
  • ,则构建失败

    如果启动Orca,我可以很容易地看到"file"表并进行计数,但是我不知道如何从MSBuild中自动执行此操作。是否有一些API或其他机制可以从MSI中获取此信息?

    我不介意编写自定义MSBuild任务来提取MSI文件表计数。

    最佳答案

    创建一个新的Visual Studio项目,添加对c:\windows\system32\msi.dll的引用,并使用以下代码读取msi文件中的文件数:

    Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
    var installer =
       (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
    var msi = installer.OpenDatabase(@"path\to\some\file.msi", 0);
    var fileView = msi.OpenView("SELECT FileName FROM File");
    fileView.Execute(null);
    int fileCount = 0;
    while (fileView.Fetch() != null)
    {
       fileCount++;
    }
    Console.WriteLine(fileCount);
    

    此代码使用WindowsInstaller.Installer COM对象,它是Windows安装程序自动化API的入口点。看看complete reference documentation

    编辑:显然wix带有包装msi.dll的托管程序集(在C:\program files\Windows Installer XML v3\sdk中)。我猜这就是罗布在他的回答中指的是“DTF”。使用Microsoft.Deployment.WindowsInstaller程序集和 namespace 中的类型可以将代码示例简化为:

    var database = new Database(@"\path\to\some\file.msi");
    var list = database.ExecuteQuery("SELECT FileName FROM File");
    Console.WriteLine(list.Count);
    

    关于wix - 如何从MSI "File"表中提取数据(文件计数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668122/

    相关文章:

    WiX 在 msi 中安装 C++ 可再发行组件

    azure-devops - 在 VSTS 版本中安装 MSI

    windows-installer - Windows 安装程序自定义操作错误 1631

    使用组策略部署时 WIX MSI customaction 未运行

    wix - 如何在 SendTo 文件夹中为所有 WiX 用户创建快捷方式?

    wix - 安装到不同位置但引用相同组件的功能部件

    wix - 在标准 Wix 对话框中自定义文本

    wix - 在 WiX 3.7 中结合绝对路径和相对路径

    .net - 为什么 WiX Burn 不重新启动并恢复执行?

    .net - 如何抑制由我​​的 Bootstrap 引起的强制重启?