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,甚至仅限于字符串参数,它允许我的安装项目的二进制重用的一个很好的解决方案,其中安装项目控制特定参数,而不是自定义操作代码本身。
答案 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"];
希望这有帮助。