在我们的构建过程中,当前有可能将基于非代码的文件(例如图像文件)添加到我们的 Web 项目中,但不包含在 WiX 构建的 MSI 安装程序中。
为了帮助防止这种情况,我想在 WiX 项目的 AfterBuild 目标中执行以下操作:
- 获取所有已构建文件的计数(Web 部署项目的输出)
- 获取 MSI 中内置的所有文件的计数(来自 MSI 中的“文件”表)
- 比较计数,如果不匹配则构建失败
如果我启动 Orca,我可以轻松查看文件表并进行计数,但我不知道如何从 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 的入口点。看看完整的参考文档.
edit:显然 wix 带有托管程序集(在C:\program files\Windows Installer XML v3\sdk
)它包装 msi.dll。我想这就是 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)