WiX 3.8中的自定义操作

时间:2015-01-14 14:28:50

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

我的项目中出现自定义操作问题。有些正在工作,有些则没有。我在VS 2012中有两个项目C#CustomAction项目和安装项目。 我的自定义操作看起来像这样。这两个第一个动作不会导致问题。只有第三个不起作用。

[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>

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

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

2 个答案:

答案 0 :(得分:0)

可能会有所帮助的一些事情:

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

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

您认为MsiPublishAssemblies解决后的问题是什么?对我来说,为什么你认为这会有所帮助,这一点并不明显。我不认为它与问题有关,除非您的代码实际上依赖于GAC中的程序集,因为它不会被安装直到InstallFinalize(这是真正重要的,不是发布程序集) )。

答案 1 :(得分:0)

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

更难调试:

  1. 简化您的CustomAction CheckPrograms以设置虚拟属性并返回ActionResult.Success。然后使用详细日志记录运行msiexec以查看是否已达到设置属性的代码。
  2. 如果1)确实显示了dummy属性的设置,则添加a)显示带有静态字符串的MessageBox,或者b)枚举进程(可能在下一个小步骤中),列出这些枚举的一些信息进入dummy-property以查看是否获得了预期的值。
  3. 如果1)没有显示dummy-property的设置,请尝试将简化的CustomAction集成到另一个点(或者你提出的任何其他内容)。
  4. 这一切归结为:如果您对可能的错误没有任何想法,尝试逐个简化不同区域的违规代码

    提供更多信息:

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