如何通过Installshield创建自定义操作,该操作调用带有字符串参数的WiX自定义操作?

时间:2014-01-28 04:52:42

标签: c# wix windows-installer installshield custom-action

Installshield是否可以运行WiX自定义操作,该操作除了所需的Session参数之外还需要其他参数?例如:

[CustomAction]
public static ActionResult CustomAction1(Session session, string param)
{
  session.Log(param);
  return ActionResult.Success;
}

(注意第二个参数)

我正在通过Installshield 2012创建Type 1自定义操作。它需要一个Function Name,我看不到添加参数的方法。 我想我希望这里有一个hack,所以如果MSI数据库中有不支持的机制,请分享

我能够使用Installshield Interop,甚至仅限于字符串参数,它允许我的安装项目的二进制重用的一个很好的解决方案,其中安装项目控制特定参数,而不是自定义操作代码本身。

1 个答案:

答案 0 :(得分:3)

我认为不可能将额外的参数传递给自定义操作方法。它由Windows Installer调用,并且它期望明确定义的签名似乎是合理的。

但是,你可以解决它。如果您需要将一些数据传递给自定义操作,则可以使用Session对象。

如果您的自定义操作是即时的,您可以在自定义操作代码中解决MSI属性,如下所示:

session["PROPERTYNAME"] = "some value";

在立即自定义操作中,session对象可以处理属性表中的任何属性。

如果您推迟了自定义操作,则可以使用一种机制将必要的数据传递给它。您应该创建一个通常的立即“set-a-property”自定义操作,并将必要的数据传递给称为延迟CA名称的属性。样本通常比将其塑造成文字要清晰得多:

<!-- This is a subsidiary CA, note the property name is equal to the deferred CA name -->
<CustomAction Id="SetForMyDeferredCA" Return="check" Property="MyDeferredCA" Value="source=[SourceFolder];target=[TargetFolder]"/>
<!-- And this is the deferred CA which does the job -->
<CustomAction Id="MyDeferredCA" Return="asyncWait" Execute="deferred" BinaryKey="CustomActions" DllEntry="MyMethodName" />

在延期CA中,您可以像这样处理传递的数据:

var source = session.CustomActionData["source"];
var target = session.CustomActionData["target"];

希望这有帮助。