gpt4 book ai didi

wix - 如何在不调用安装的情况下执行 MSI 中存在的自定义操作?

转载 作者:行者123 更新时间:2023-12-05 05:28:22 29 4
gpt4 key购买 nike

给定:

  1. Wix 3.0 用于创建 MSI。
  2. 该产品包含多项功能。
  3. 每个功能都有几个子功能。这是一个标准的 MSI 功能树。
  4. 每个功能或子功能都依赖于多个外部组件。例如。 .NET 4、ASP.NET 等
  5. 使用 Wix 3.0 SDK 以 C# 编写的自定义操作处理这些依赖并评估组件是否存在给定的一组特征。
  6. 在安装时,如果给定的依赖组件缺失选择功能,安装失败。

实现:能够执行先决条件检查,这已在 MSI 中作为安装期间的自定义操作完成,无需在给定计算机上安装 MSI。

失败的尝试:

1)自定义操作具有这样的函数签名

[CustomAction]
public static ActionResult ProcessFeaturePrerequisite(Session 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 调用上面的方法时,下面的事情失败了。

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 中找不到任何允许我在不开始安装的情况下传递返回 session 对象的附加参数的 API。我的猜测是传递这样的参数将使 session.Features 更有效。

问题:那么我如何实现上述目标呢?有没有

  1. Wix SDK 中允许我无需调用自定义操作的任何 API调用安装?
  2. 从命令行为给定的 MSI 调用自定义操作的任何方式不安装?
  3. 让 Wix 将 MSI 更改为接受命令字符串的任何方法包含仅评估操作的自定义操作名称?
  4. 有没有更好的方法来做同样的事情?

最佳答案

我想您正在尝试使用错误的工具来解决问题。据我了解,您想从某个工具内部检查安装先决条件,而不是从安装中检查。只要该功能在 MSI 包中作为自定义操作实现,您就会希望利用该功能以避免重复代码。

我会根据你的情况选择不同的方式:

  1. 将实际检查先决条件的功能提取到单独的程序集中,例如checkprereq.dll
  2. 重构您的自定义操作以引用 checkprereq.dll。请注意,您必须将 checkprereq.dll 添加到您的 Binary 表以及 customaction.dll。您应该在这里划分责任:自定义操作部分与 MSI 的东西一起工作 - 在您的情况下,它根据用户选择的功能组合定义要检查的先决条件 - 以及功能部分 - 实际先决条件验证,由checkprereq.dll
  3. 当您需要检查先决条件而不触发安装过程时,请单独使用 checkprereq.dll

您在此处概述的尝试证明了一个重要的错误假设:安装时的 session 对象与您通过只读打开 MSI 数据库获得的安装对象相同。这不是真的!实际上,我怀疑在安装事务之外引用 session 对象是否有意义。顾名思义,它是一个安装 session ,即在进程中可用 - 而不是静态的。

当 MSI 包只是一个文件而不是一个正在运行的安装时,它应该被视为一个数据库。因此,当您只打开阅读而不安装时,只能查询和使用 MSI 包中的静态信息。例如,我的意思是您可以查询 Feature 表,但不要指望它包含仅在安装时有意义的信息,例如用户是否选择了要安装的功能。

希望这是有道理的,并为您指明了正确的方向。

关于wix - 如何在不调用安装的情况下执行 MSI 中存在的自定义操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11686705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com