如何查看 MSI 是不是启用了 InstanceTransforms?
Posted
技术标签:
【中文标题】如何查看 MSI 是不是启用了 InstanceTransforms?【英文标题】:How to find whether the MSI has InstanceTransforms enabled or not?如何查看 MSI 是否启用了 InstanceTransforms? 【发布时间】:2020-06-15 09:12:00 【问题描述】:我们有一个基于 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)?
请指教。
@Christopher 画家
【问题讨论】:
【参考方案1】:我不完全按照你的问题。通常,您可以使用 WiX DTF Microsoft.Deployment.WindowsInstaller 库对 MSI 数据库和 MSI API 进行查询。您可以查询 Property 表以获取 ProductCode,然后查询已安装的产品以查看它是否已安装。要查看 MSI 是否有可用的嵌入式转换,您可以查询 _Storages 流,应用转换,然后也读取这些属性。
如果您想联系我以获得更详细的咨询,我擅长 WPF/MVVM 开发。
【讨论】:
我有一个 MSI,里面有 50 个嵌入式转换实例。我知道每个实例的实例 ID。我是否可以从 MSI 获取给定 ID 的产品代码? 是的。打开数据库。应用变换。查询值并关闭数据库。就像在 ORCA 中一样,但在 DTF 中进行。 我有一个逻辑,如果 _Storage 表有记录,即 >0,那么我可以断定 MSI 具有嵌入式转换,如果它返回 0,则没有嵌入式转换。那是对的吗?或任何其他有效的方法来确定 msi 是否嵌入了转换?以上是关于如何查看 MSI 是不是启用了 InstanceTransforms?的主要内容,如果未能解决你的问题,请参考以下文章