gpt4 book ai didi

c# - 如何将参数传递给自定义操作?

转载 作者:太空狗 更新时间:2023-10-29 17:29:11 33 4
gpt4 key购买 nike

我正在尝试创建一个带有“值”属性的自定义操作,我想将参数传递给 C# 代码(TARGETDIR 和版本)。

但是,我收到一条错误消息,指出 DLLENtry 和 Value 不能共存。但是没有dllentry的自定义 Action 是无效的。

这是代码:

 <CustomAction Id="SetMAWPrefferences"
Value="InstallDir=[TARGETDIR];Version=2.0.0.1"
Return="check"
Execute="commit"
BinaryKey="ImportExportBinary"
/>

为此我得到了这个错误:

Error 9 ICE68: Invalid custom action type for action 'SetMAWPrefferences'.

有什么想法吗?

最佳答案

有两种方法可以将参数传递给自定义操作,一种适用于立即执行的 CA,另一种适用于延迟的自定义操作。

即时 CA(无法回滚):

为了将参数传递给直接 CA,您可以设置具有所需名称的属性并从您的 session 中访问它。

在 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 中使用此属性的值,您将需要两个自定义操作:

  • CA 1 将 CA 的 CustomActionData 设置为立即执行。 (请记住使用为您的 CustomAction 定义的相同名称命名该属性。

  • CA 2 具有使用 CustomActionData 的特定逻辑的 CA。

我建议您在所有情况下都使用 CustomActionData,这种方式更容易将您的 CA 从立即转换为延迟,并且代码更易于阅读。

引用资料:

session.Format CustomActionData

关于c# - 如何将参数传递给自定义操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27101579/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com