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:
Crea propiedades con los valores deseados:
<Property Id="InstallDir" Value="someDefaultValue" /> <Property Id="Version" Value="2.0.0.1" />
Cree una acción personalizada para establecer la propiedad
InstallDir
:<CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
Crear acción personalizada:
<CustomAction Id="SetMAWPrefferences" Return="check" Execute="commit" BinaryKey="ImportExportBinary" DllEntry="YourCustomAction" />
Programe acciones personalizadas para la ejecución durante el proceso de instalación:
<InstallExecuteSequence> <Custom Action="SetDirProp" After="CostFinalize" /> <Custom Action="SetMAWPreferences" ... /> ... </InstallExecuteSequence>
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