当前位置:  开发笔记 > Android > 正文

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

如何解决《如何从MSI"文件"表中提取数据(文件计数)》经验,为你挑选了1个好方法。

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

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

获取构建的所有文件的计数(从Web部署项目输出)

获取内置到MSI中的所有文件的计数(来自MSI中的"文件"表)

比较计数和失败构建,如果它们不匹配

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

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



1> Wim Coenen..:

创建一个新的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.InstallerCOM对象,它是Windows安装程序自动化API的入口点.请查看完整的参考文档.

编辑:显然wix附带了C:\program files\Windows Installer XML v3\sdk包装msi.dll的托管程序集(in ).我想这就是Rob在他的回答中所说的"DTF".使用Microsoft.Deployment.WindowsInstaller程序集和命名空间中的类型会将代码示例简化为:

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

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有