鉴于:
- Wix 3.0 用于创建 MSI。
- 该产品由多个功能组成。
- 每个功能都有几个子功能。这是一个标准的 MSI 功能树。
- 每个功能或子功能都依赖于多个外部组件。例如 .NET 4、ASP.NET 等
- 使用 Wix 3.0 SDK 以 C# 编写的自定义操作会处理这些依赖关系,并评估给定功能集是否存在组件。
- 在安装时,如果缺少给定功能选择的依赖组件,安装将失败。
实现: 无需在给定机器上安装 MSI 即可执行先决条件检查,这已在 MSI 中作为安装期间的自定义操作完成。
失败的尝试:
1) 自定义操作具有这样的功能签名
[CustomAction]
public static ActionResult ProcessFeaturePrerequisite(Session session);
为了获得会话对象,我使用了 Wix 3.0 SDK 中的以下 API
Session session = Installer.OpenPackage("Pathto\\Product.msi", true); // true doesn’t install it. Also tried with false, but didn’t work.
当我用上面的会话调用上面的方法时,事情失败了。
session.Features["SomeFeature"].CurrentState;
这会引发异常。
System.ArgumentException was unhandled by user code
Message=Feature ID not registered. SomeFeature
Source=Microsoft.Deployment.WindowsInstaller
StackTrace:
at Microsoft.Deployment.WindowsInstaller.FeatureInfo.get_CurrentState()
同样在确定先决条件状态的关键 API 下,总是返回 false。
session.EvaluateCondition(prereq);
2) 我知道一种命令行方式来指定上述 MSI 的功能并安装它。它是这样的
msiexec /i "Product.msi" ADDLOCAL=ALL REMOVE="Foo,Bar "
我在 SDK 中找不到任何 API,它允许我传递额外的参数,这些参数在不开始安装的情况下返回会话对象。我的猜测是传递这样的参数将使 session.Features 更有效。
问题: 那么我如何实现上述目标?有没有
- Wix SDK 中的任何 API 允许我在不调用安装的情况下调用自定义操作?
- 有什么方法可以在不安装的情况下从命令行为给定的 MSI 调用自定义操作?
- 有什么方法可以让 Wix 将 MSI 更改为接受包含仅评估操作的自定义操作名称的命令字符串?
- 有更好的方法来做同样的事情吗?