有两种方法可以将参数传递给自定义操作,其中一种适用于立即执行的CA,另一种适用于延迟自定义操作。
立即CA(无法撤消):
为了向立即CA传递参数,您可以设置具有所需名称的属性并从会话中访问它。
在Wix中:
<Property Id="MyProp" Value="MyValue" />
在加州:
[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
string myArg = session["MyProp"];
}
延迟自定义操作:
为了将参数传递给延迟自定义操作,您需要使用CustomActionData Property,这是您可以从延迟自定义操作中访问的唯一属性。
在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 从即时转换为延迟,并且代码更易于阅读。
参考资料:
session.Format
CustomActionData
<CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
。 - Steve Smith