【问题标题】:Custom Actions in WiX 3.8WiX 3.8 中的自定义操作
【发布时间】:2015-01-14 14:28:49
【问题描述】:

我的项目中的自定义操作有问题。有些正在工作,有些没有。我在 VS 2012 中有两个项目 C# CustomAction Project 和 Setup Project。 我的自定义操作如下所示。前两个操作不会导致问题。只有第三个不工作。

[CustomAction]
public static ActionResult WriteToConfigStore(Session session)
{
    ...
}

[CustomAction]
public static ActionResult CleanConfigStore(Session session)
{
    ...
}

[CustomAction]
public static ActionResult CheckPrograms(Session session)
{
    string s = "";

    Process[] p = Process.GetProcesses();

    foreach (Process ps in p)
    {
        s += ps.ProcessName + ";";
    }

    MessageBox.Show(s);

    return ActionResult.Success;
}

我这样定义自定义操作:

<Binary Id="CustomActionsId" SourceFile="$(var.ResourcesDir)\DriverCA.CA.dll" />
<CustomAction Id="ca_writeToConfigStoreId" BinaryKey="CustomActionsId" DllEntry="WriteToConfigStore" Execute="deferred" Return="check" />
<CustomAction Id="ca_cleanConfigStoreId" BinaryKey="CustomActionsId" DllEntry="CleanConfigStore" Execute="deferred" Return="check" />
<CustomAction Id="ca_setParameter" Return="check" Property="ca_writeToConfigStoreId" Value="param1=.;param2=;param3=;param4=;param5=IviDriver1.0, IviSwtch1.0" />
<CustomAction Id="ca_setCleanParameter" Return="check" Property="ca_cleanConfigStoreId" Value="param1=;" />
<CustomAction Id="ca_checkProgramsId" BinaryKey="CustomActionsId" DllEntry="CheckPrograms" Execute="deferred" Return="check" />

我的安装顺序如下所示:

<InstallExecuteSequence>
  <Custom Action="ca_setParameter" Before="InstallFinalize" />
  <Custom Action="ca_setCleanParameter" Before="InstallFinalize" />
  <!--Call only when not uninstall (install, change, repair)--> 
  <Custom Action="ca_writeToConfigStoreId" After="ca_setParameter">NOT(REMOVE="ALL")</Custom>
  <!--Call only when uninstall or upgrade--> 
  <Custom Action="ca_cleanConfigStoreId" After="ca_setCleanParameter">REMOVE="ALL"</Custom>
  <!--Call only when not install--> 
  <Custom Action="ca_checkProgramsId" After="MsiUnpublishAssemblies">Installed</Custom>
</InstallExecuteSequence>

当我评论 &lt;Custom Action="ca_checkProgramsId" After="MsiUnpublishAssemblies"&gt;Installed&lt;/Custom&gt; 时,一切正常。但是当这部分没有被注释掉时,卸载程序时出现错误There is problem with this Windows Installer package. A DLL required for this install to complete could not be run.。我看不到任何错误。每个名字和身份证都是正确的。我没有使用 PInvoke 或类似的东西。

更新: 自定义操作的目标是检查某些进程是否正在运行并根据它中断卸载过程。设置是每个系统的,我在任何其他自定义操作中的消息框都没有问题。我用另一个自定义动作项目解决了它,该项目本身有问题自定义动作,但除此之外我使用完全相同的方法和设置定义(当然不包括另一个 dll 定义)仍然不知道问题是什么。

【问题讨论】:

  • 这将有助于了解您的最终目标是什么。通常不需要自定义操作。
  • 我需要检查某些进程是否正在运行,并根据它中断卸载进程。我更新了我的问题。

标签: c# wix custom-action wix3.8


【解决方案1】:

一些可能有帮助的事情:

您可能需要特权才能枚举系统上的进程 - 我无法确定您的设置是按用户(因此未提升)还是按系统(并通过提升提示提升)。

我不确定您是否可以执行 MessageBox.Show 如果自定义操作被提升(并使用系统帐户运行),因为将 Windows 消息循环暴露给桌面是一个安全漏洞。

您认为 MsiPublishAssemblies 之后要解决的问题是什么?我不清楚你为什么认为这有帮助。我不认为它与问题有关,除非您的代码实际上依赖于 GAC 中的程序集,因为它直到 InstallFinalize 才会安装(这才是真正重要的,而不是发布程序集)。

【讨论】:

  • MsiPublishAssemblies 在提交阶段运行,因此调度“之后”实际上很可能是“之前”,因为所有延迟都在提交之前。
  • 按系统设置,我在任何其他自定义操作中的消息框都没有问题。我更新了我的问题。
  • 问题仍然是您的代码失败了,因此您需要调试代码中的实际故障点,即崩溃的行。由于我所说的,我仍然会怀疑 MessageBox,所以我不会这么快就把它抛到一边。如果是每个系统,它会提升吗?如果您的 MessageBox 调用确实有效,那么查找崩溃的最简单方法是在该方法中的每一行代码之后调用 MessageBox 并查看会发生什么。另外,就个人而言,我不会使用字符串:我会使用 StringBuilder。
  • 关键是永远不会从设置中调用该方法。安装程序只是找不到它。我知道它在里面,我看了看。我按照问题末尾的描述解决了它,但我仍然无法弄清楚为什么它不适用于单个 dll。
  • 原始帖子说您收到报告问题的错误消息 - Dll 无法运行。所以它被调用了,或者至少尝试了一个调用。该消息通常并不意味着它找不到它,因为二进制意味着它在 MSI 文件中。要么无法加载(因为缺少依赖项),要么加载并崩溃。
【解决方案2】:

不是真正的答案,但希望不仅仅是评论。

更难调试:

  1. 将您的 CustomAction CheckPrograms 简化为只设置一个虚拟属性并返回 ActionResult.Success。然后使用详细日志记录运行 msiexec 以查看您是否到达了设置属性的代码。
  2. 如果 1) 确实显示了虚拟属性的设置,则添加 a) 显示带有静态字符串的 MessageBox,或 b) 枚举进程(可能在下一个小步骤中)放置这些枚举的一些信息处理到 dummy-property 以查看您是否获得预期值。
  3. 如果 1) 未显示虚拟属性的设置,请尝试在其他点(或您想出的任何其他内容)集成简化的 CustomAction。

这一切都归结为:如果您对可能的错误没有任何想法,尝试逐个简化不同区域中的违规代码

提供更多信息:

  1. 您是否简化了问题来说明问题?如果是这样,这个简化版本是否仍然重现错误? (例如,非常重要的一点是:您是否省略了一些 CustomAction?)
  2. 作为最后的手段,想出一个简单的例子来触发错误并让它在某个地方可以访问。也许有人会看。

【讨论】:

  • 正如我在另一条评论中已经声明的那样:关键是永远不会从设置中调用自定义操作。安装程序只是找不到它。我知道它在里面,我看了看。我按照问题末尾的描述解决了它,但我仍然无法弄清楚为什么它不能与单个 dll 一起使用。 - 我试图将它简化为一个自定义操作。它没有用。为自定义操作创建新项目很有帮助。
  • 在写“我试图将其简化为一个自定义操作”时,您是否仅在 wix 配置中省略了 CA(即删除 xml),或者您是否也将其从导出列表中删除DriverCA.CA.dll 中的函数(例如,通过删除 [CustomAction] 属性)?我问是因为WiX issue 4502;有关更多详细信息,请查看this SO answer。如果您最初为简单起见省略了一些 CA,现在通过将一些代码移动到另一个 CA-dll 来解决问题,那么可能就是这样。
  • 是的,我删除了[CustomAction] 属性以及整个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多