有两种方法可以将参数传递给自定义操作,一种适用于立即执行的 CA,另一种适用于延迟的自定义操作。
立即 CA(不能回滚):
为了将参数传递给直接 CA,您可以设置具有所需名称的属性并从会话中访问它。
在 Wix 中:
<Property Id="MyProp" Value="MyValue" />
在加州:
[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
string myArg = session["MyProp"];
}
延迟 CA:
要将参数传递给延迟 CA,您需要使用 CustomActionData Property,此属性是您可以从延迟 CA 访问的唯一属性。
对于 WIX,DTF 包含一个 CustomActionData 类,它是一个键/值字典,您可以使用以下方式访问它:
在 Wix 中:
<CustomAction Id="MyCustomAction" .../>
<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />
在加州:
[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
CustomActionData data = session.CustomActionData;
//Access each argument like this:
string arg1 = data["Arg1"];
string arg2 = data["Arg2"];
string arg3 = data["Arg3"];
}
立即 CA + CustomActionData:
如果您想为您的即时 CA 使用 CustomActionData,您可以执行以下操作:
在 Wix 中:
<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />
在加州:
[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
CustomActionData data = new CustomActionData(session["MyCustomAction"]);
//Access each argument like this:
string arg1 = data["Arg1"];
string arg2 = data["Arg2"];
string arg3 = data["Arg3"];
string arg4 = session.Format(data["Arg4"]);
}
对于 Arg4,因为它包含属性的值,您需要像这样访问它:
string arg4 = session.Format(data["Arg4"]);
不幸的是,这仅适用于直接 CA,这意味着如果您想在延迟 CA 中使用此属性的值,您将需要有两个自定义操作:
我建议您对所有情况都使用 CustomActionData,这样更容易将您的 CA 从 Immediate 转换为 Deferred,并且代码更易于阅读。
参考资料:
session.Format
CustomActionData