如何从 MSI“文件”中提取数据(文件计数) 桌子
在我们的构建过程中,当前有可能将基于非代码的文件(例如图像文件)添加到我们的 Web 项目中,但不包含在 WiX 构建的 MSI 安装程序中。
为了帮助防止这种情况,我想在 WiX 项目的 AfterBuild 目标中执行以下操作:
- 获取构建的所有文件的计数(来自 Web 部署项目的输出)
- 获取构建到 MSI 中的所有文件的计数(来自“文件”表) MSI)
- 比较计数,如果不匹配则构建失败
如果我启动 Orca,我可以轻松查看文件表和计数,但我不知道如何从 MSBuild 自动化此操作。 是否有一些 API 或其他机制可以从 MSI 中获取此信息?
我不介意编写自定义 MSBuild 任务来提取 MSI 文件表计数。
In our build process there is currently the potential for non-code based files (such as image files) to be added to our web project, but not included in the MSI installer built by WiX.
To help prevent this, I want to perform the following in the AfterBuild target for our WiX project:
- Get a count of all files built (output from web deployment project)
- Get a count of all files built into MSI (from "File" table in MSI)
- Compare counts and fail build if they don't match
If I fire up Orca I can easily see the File table and count, but I don't know how to automate this from MSBuild. Is there some API or other mechanism to get this information out of an MSI?
I don't mind writing a custom MSBuild task to extract the MSI File table count.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
创建一个新的 Visual Studio 项目,添加对
c:\windows\system32\msi.dll
的引用,并使用以下代码读取 msi 文件中的文件数量:此代码使用
WindowsInstaller.Installer
COM 对象,它是 Windows 安装程序自动化 API 的入口点。 请查看完整参考文档。编辑:显然wix附带了托管程序集(在
C:\program files\Windows Installer XML v3\sdk
中),它包装了msi.dll。 我想这就是 Rob 在他的回答中所说的“DTF”。 使用 Microsoft.Deployment.WindowsInstaller 程序集和命名空间中的类型会将代码示例简化为:Create a new visual studio project, add a reference to
c:\windows\system32\msi.dll
and use the following code to read the number of files in a msi file:This code uses the
WindowsInstaller.Installer
COM object, which is the entry-point for the windows installer automation API. Take a look at the complete reference documentation.edit: apparently wix comes with managed assemblies (in
C:\program files\Windows Installer XML v3\sdk
) which wrap msi.dll. I guess this is what Rob is referring to by "DTF" in his answer. Using the types in the Microsoft.Deployment.WindowsInstaller assembly and namespace would simplify the code sample to this:MSI 文件是带有自定义 SQL 引擎的小型数据库。 您只需要运行查询:
并计算返回的行数。 集成到 MSBuild 任务的最简单方法可能是使用 WiX 的 DTF,它为所有 MSI API 提供托管包装器。
一旦所有工具就位,解决方案就会非常简单。
MSI files are little baby databases with a custom SQL engine. You just need to run the query:
and count the number of rows that come back. Easiest way to integrate into an MSBuild Task would probably be to use WiX's DTF which provides managed wrappers for all of the MSI APIs.
The solution will be really simple once you get all the tools in place.
由于有多种方法可以实现此目的,因此我正在用我现在使用的结果来回答我自己的问题,这要感谢 wcoenen 和 Rob 的回答。
这是自定义 MSBuild 任务:
有几点需要注意:
以下是相应的单元测试,假设您的测试项目中有 Test.msi ,并将其复制到输出目录。
Since there are multiple ways you could implement this, i'm answering my own question with the results I'm now using thanks to the answers from wcoenen and Rob.
This is the custom MSBuild task:
Couple of things to note:
Here are the corresponding unit tests, assumption is you have Test.msi in your test project which is copied to the output directory.
WinRAR 将 MSI 识别为自解压 CAB 存档(在赋予其 .rar 扩展名后)。 我想您可以将文件复制到某处,重命名,用 WinRAR 解压,然后对文件进行计数。 不过,这些文件不会有原来的名称。
这似乎有点过时了,我不知道是否可以有任何帮助。
WinRAR identifies the MSI as a self-extracting CAB archive (after giving it a .rar extension). I suppose you could copy the file somewhere, rename it, unpack it with WinRAR, then count the files. The files will not have their original names, though.
This seems a bit outdated and I don't know if it could be of any help.