referencia por pasar parametros objetos entrada como c# wix custom-action

c# - por - ¿Cómo pasar parámetros a la acción personalizada?



parametros por referencia c# (2)

Intento crear una acción personalizada con el atributo "Valor", quiero pasar parámetros al código C # (el DESTINO TARGET y la versión).

Sin embargo, aparece un error que indica que DLLENtry y Value no pueden coexistir. Pero la acción personalizada sin dllentry no es válida.

Este es el código:

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

Y por eso me sale este error:

Error 9 ICE68: tipo de acción personalizada no válida para la acción ''SetMAWPrefferences''.

¿Alguna idea de como hacerlo?


Tenga en cuenta que está utilizando el atributo Value de la manera incorrecta:

... este atributo se debe usar con el atributo de propiedad para establecer la propiedad ... Source

Con base en el artículo Crear acciones personalizadas de WiX en C # y Pasar parámetros , debe hacer lo siguiente:

  1. Crea propiedades con los valores deseados:

    <Property Id="InstallDir" Value="someDefaultValue" /> <Property Id="Version" Value="2.0.0.1" />

  2. Cree una acción personalizada para establecer la propiedad InstallDir :

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />

  3. Crear acción personalizada:

    <CustomAction Id="SetMAWPrefferences" Return="check" Execute="commit" BinaryKey="ImportExportBinary" DllEntry="YourCustomAction" />

  4. Programe acciones personalizadas para la ejecución durante el proceso de instalación:

    <InstallExecuteSequence> <Custom Action="SetDirProp" After="CostFinalize" /> <Custom Action="SetMAWPreferences" ... /> ... </InstallExecuteSequence>

  5. Acceda a esas propiedades desde su acción personalizada de la siguiente manera:

    [CustomAction] public static ActionResult YourCustomAction(Session session) { // session["InstallDir"] // session["Version"] }


Hay dos formas de pasar parámetros a las acciones personalizadas, una funcionará para la CA de ejecución inmediata y la otra funcionará para las acciones personalizadas diferidas.

CA inmediata (no se puede revertir):

Para pasar argumentos a la CA inmediata, puede establecer una propiedad con el nombre requerido y acceder a ella desde su sesión.

En Wix:

<Property Id="MyProp" Value="MyValue" />

En CA:

[CustomAction] public static ActionResult NameOfMyCA(Session session) { string myArg = session["MyProp"]; }

CA diferida:

Para pasar argumentos a la CA diferida necesita usar la propiedad CustomActionData , esta propiedad es la única a la que puede acceder desde una CA diferida.

En el caso de WIX, la DTF incluye una clase CustomActionData que es un diccionario clave / valor, y puede acceder a ella usando:

En Wix:

<CustomAction Id="MyCustomAction" .../> <Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />

En 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"]; }

CA + CustomActionData inmediato:

Si desea utilizar CustomActionData para su CA inmediata, puede hacer algo como esto:

En Wix:

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />

En 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"]); }

En el caso de Arg4, ya que contiene el valor de una propiedad, tendrá que acceder de esta manera:

string arg4 = session.Format(data["Arg4"]);

Desafortunadamente, esto funcionará solo en la CA inmediata, esto significa que si desea utilizar el valor de esta propiedad en una CA diferida, deberá tener dos acciones personalizadas:

  • CA 1 para configurar CustomActionData para la CA ejecutada como inmediata. (Recuerde nombrar la propiedad con el mismo nombre definido para su CustomAction).

  • CA 2 la CA con la lógica específica que consume CustomActionData.

Le sugiero que use CustomActionData para todos los casos, de esta manera es más fácil convertir CA de Inmediato a Diferido y el código es más fácil de leer.

Referencias

session.Format CustomActionData