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

Ehu*_*and 10 c# custom-action wix

我正在尝试使用"Value"属性创建自定义操作,我想将参数传递给C#代码(TARGETDIR和版本).

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

这是代码:

 <CustomAction Id="SetMAWPrefferences"
                Value="InstallDir=[TARGETDIR];Version=2.0.0.1"
                Return="check"
                Execute="commit"
                BinaryKey="ImportExportBinary"                    
                />
Run Code Online (Sandbox Code Playgroud)

为此它我得到这个错误:

错误9 ICE68:操作'SetMAWPrefferences'的自定义操作类型无效.

有什么想法怎么做?

Rol*_*olo 28

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

立即CA(无法回滚):

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

在Wix中:

<Property Id="MyProp" Value="MyValue" />
Run Code Online (Sandbox Code Playgroud)

在CA:

[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
    string myArg = session["MyProp"];
}   
Run Code Online (Sandbox Code Playgroud)

递延CA:

为了将参数传递给延迟CA,您需要使用CustomActionData属性,此属性是您可以从延迟CA访问的唯一属性.

对于WIX,DTF包含一个KeyActionData类,它是一个键/值字典,您可以使用以下命令访问它:

在Wix中:

<CustomAction Id="MyCustomAction" .../>

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />
Run Code Online (Sandbox Code Playgroud)

在CA:

[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"];
}    
Run Code Online (Sandbox Code Playgroud)

立即CA + CustomActionData:

如果要为立即CA使用CustomActionData,可以执行以下操作:

在Wix中:

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />
Run Code Online (Sandbox Code Playgroud)

在CA:

[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"]);
}
Run Code Online (Sandbox Code Playgroud)

对于Arg4,因为它包含属性的值,您需要像这样访问它:

string arg4 = session.Format(data["Arg4"]);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仅适用于即时CA,这意味着如果要在延迟CA中使用此属性的值,则需要有两个自定义操作:

  • CA 1为即时执行的CA设置CustomActionData.(请记住使用为CustomAction定义的相同名称命名属性.

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

我建议您在所有情况下使用CustomActionData,这种方式更容易将CA从Immediate转换为Deferred,并且代码更易于阅读.

参考文献:

session.Format CustomActionData


Yur*_*rii 6

注意,您Value以错误的方式使用属性:

...此属性必须与Property属性一起使用才能设置属性... Source


基于在C#中创建WiX自定义操作和传递参数一文,您应该:

  1. 创建具有所需值的属性:

    <Property Id="InstallDir" Value="someDefaultValue" />
    <Property Id="Version" Value="2.0.0.1" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建自定义操作以设置InstallDir属性:

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建自定义操作:

    <CustomAction Id="SetMAWPrefferences" 
        Return="check" 
        Execute="commit" 
        BinaryKey="ImportExportBinary" 
        DllEntry="YourCustomAction" />
    
    Run Code Online (Sandbox Code Playgroud)
  4. 计划自定义操作以在安装过程中执行:

    <InstallExecuteSequence>
        <Custom Action="SetDirProp" After="CostFinalize" />
        <Custom Action="SetMAWPreferences" ... />
        ...
    </InstallExecuteSequence>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 通过以下自定义操作访问这些属性:

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
    
    Run Code Online (Sandbox Code Playgroud)