首页 > 解决方案 > 如何查看 MSI 是否启用了 InstanceTransforms?

问题描述

我们有一个基于 WPF 的外部 UI 应用程序,即 setup.exe,它包装了在 WiX 中开发的 msi。我们要求某些组件/msi 需要多实例支持,有些不需要多实例支持,但所有组件都是单个包的一部分。

我们在构建期间为每个实例预定义了 InstanceID、ProductCode 和 UpdgradeCode。因为动态创建实例 ID 会在补丁/升级方案中产生复杂性。

我们希望 Setup.exe 做两件事,

1.它应该查找目标计算机并检测是否已经安装了任何组件。要做到这一点,需要产品代码。

2.它应该自动检测msi复制到路径中并查找InstanceTransforms是否存在于msi中。如果找到 InstanceTransforms,那么它应该获取已定义的实例 ID。因为我们不想在 Setup.exe 中保留任何业务逻辑。原因是避免每次更改 msi 时都重新编译 Setup.exe。

现在 Setup.exe 将知道 msi 是否需要实例 ID,基于它将调用 msi 并传递命令行参数。这是一种避免回归的插件机制。

问题:我们无法从 MSI 检索 InstanceTransforms,可能是因为它不是属性。我们检查了 _Storages 表和属性表,但无法弄清楚。

我们如何在 msi 中检索 InstanceTransforms 元素及其实例定义(InstanceID 和 ProductCode)?

请指教。

@克里斯托弗画家

标签: wixmultiple-instanceswix3.7

解决方案


我不完全按照你的问题。通常,您可以使用 WiX DTF Microsoft.Deployment.WindowsInstaller 库对 MSI 数据库和 MSI API 进行查询。您可以查询 Property 表以获取 ProductCode,然后查询已安装的产品以查看它是否已安装。要查看 MSI 是否有可用的嵌入式转换,您可以查询 _Storages 流,应用转换,然后也读取这些属性。

如果您想联系我以获得更详细的咨询,我擅长 WPF/MVVM 开发。


推荐阅读