2009-05-07 17 views
26

Tengo un archivo MSI que se está creando con Wxs 3.0. Mi MSI hace referencia a una acción personalizada de C#, escrita usando el nuevo C# Custom Action project.¿Cómo transfiero las propiedades de msiexec a una acción personalizada de WiX C#?

Quiero pasar un argumento msiexec que va a parar a mi acción personalizada - por ejemplo:

msiexec/i MyApp.msi AMBIENTE = PRUEBA #

En mi archivo .wxs, me refiero a mi acción personalizada como esto:

<Property Id="ENVIRONMENT"/> 
<Binary Id="WixCustomAction.dll" SourceFile="$(var.WixCustomAction.Path)" /> 
<CustomAction Id="WixCustomAction" BinaryKey="WixCustomAction.dll" DllEntry="ConfigureSettings"/> 
<InstallExecuteSequence> 
    <Custom Action="WixCustomAction" After="InstallFiles"></Custom> 
</InstallExecuteSequence> 

mi C# acción personalizada se establece así:

[CustomAction] 
public static ActionResult ConfigureSettings(Session session) 
{ 

} 

Esperaba poder acceder a la propiedad de esta manera:

cadena environmentName = session.Property ["ENVIRONMENT"];

pero esto no parece funcionar.

¿Cómo puedo acceder a la propiedad que pasé a msiexec en mi acción personalizada?

Respuesta

29

Si en lugar de

<CustomAction Id="SetCustomActionDataValue" 
       Return="check" 
       Property="Itp.Configurator.WixCustomAction" 
       Value="[ENVIRONMENT],G2,[CONFIGFILE],[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" /> 

se escribe esto:

<CustomAction Id="SetCustomActionDataValue" 
       Return="check" 
       Property="Itp.Configurator.WixCustomAction" 
       Value="Environment=[ENVIRONMENT];G=G2;ConfigFile=[CONFIGFILE];TargetDir=[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" /> 

entonces usted será capaz de hacer referencia a las variables de la siguiente manera:

string env=session.CustomActionData["Environment"]; 
+0

Una cosa es que no de las muestras, no debe haber ningún espacio alrededor del punto y coma. – epotter

8

Su acción personalizada debe ser una acción personalizada aplazada para ejecutar After InstallFiles. Las acciones personalizadas diferidas no tienen acceso a las propiedades, pero sí tienen acceso a CustomActionData. Vea this blog post para una discusión sobre cómo obtener qué hacer al respecto. (Este ejemplo es una acción personalizada de VBScript, pero podrá recuperar el valor a través de la sesión. Colección CustomActionData)

+2

Tenga en cuenta que el enlace a la publicación del blog ya no funciona. El nuevo enlace es http://blogs.claritycon.com/sajojacob/2008/02/29/customactiondata-in-wix-with-deferred-custom-actions/ –

+3

@ SébastienNussbaumer: bueno, ese enlace ahora también está muerto. .. jlew: deberías publicar el código actual aquí, a diferencia de los enlaces. – woohoo

14

Solo para completar; utilizando el método descrito por Jeremy Lew, en el blog anterior permite lo siguiente:

Calling:

msiexec /i ITP.Platform.2.msi ENVIRONMENT=QA CONFIGFILE=EnvironmentConfig.xml 

Con esto en el archivo .wxs:

<Property Id="ENVIRONMENT" Secure="yes" /> 
<Property Id="CONFIGFILE" Secure="yes" /> 
<Binary Id="Itp.Configurator.WixCustomAction.dll" 
     SourceFile="$(var.Itp.Configurator.WixCustomAction.Path)" /> 

<CustomAction Id="SetCustomActionDataValue" 
       Return="check" 
       Property="Itp.Configurator.WixCustomAction" 
       Value="[ENVIRONMENT],G2,[CONFIGFILE],[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" /> 

<CustomAction Id="Itp.Configurator.WixCustomAction" 
       Return="check" 
       Execute="deferred" 
       BinaryKey="Itp.Configurator.WixCustomAction.dll" 
       DllEntry="ConfigureItpBrandSettings" /> 

<InstallExecuteSequence> 
    <Custom Action="SetCustomActionDataValue" After="InstallFiles"></Custom> 
    <Custom Action="Itp.Configurator.WixCustomAction" After="SetCustomActionDataValue"></Custom> 
</InstallExecuteSequence> 

Con una acción personalizada:

/// <summary> 
    /// CustomAction keys should be Environment,BrandId,ConfigPath,itpBasePath 
    /// </summary> 
    /// <param name="session"></param> 
    /// <returns></returns> 
    [CustomAction] 
    public static ActionResult ConfigureItpBrandSettings(Session session) 
    { 
     string[] arguments = GetCustomActionDataArguments(session); 

     string environmentName = arguments[0]; 
     string brandId = arguments[1]; 
     string configPath = arguments[2]; 
     string itpBasePath = arguments[3]; 

     //Do stuff 

     return ActionResult.Success; 
    } 

    private static string[] GetCustomActionDataArguments(Session session) 
    { 
     string[] keys = new string[session.CustomActionData.Keys.Count]; 
     session.CustomActionData.Keys.CopyTo(keys,0); 
     return keys[0].Split(','); 
    } 

funciona.

Analizar los argumentos de CustomActionData es bastante feo, pero funciona. Con suerte, alguien sabe una manera más elegante de hacer esto.

8

Aquí está mi código de trabajo:

<Binary Id="MyCA" SourceFile="..\bin\ChainerRun.CA.exe" /> 

<CustomAction Id="SetCustomActionDataValue" Return="check" Property="CustomActionData" Value="TARGETDIR=[TARGETDIR];AA=Description;" /> 

<CustomAction Id="ReadAndSet" 
      BinaryKey="MyCA" 
      DllEntry="ReadAndSet" 
      Execute="immediate" 
      HideTarget="no" 
      Return="check" /> 

<InstallExecuteSequence> 
    <Custom Action="SetCustomActionDataValue" Before="InstallFiles" /> 
    <Custom Action="ReadAndSet" After="SetCustomActionDataValue" /> 
</InstallExecuteSequence> 

En la función C# acción personalizada:

[CustomAction] 
public static ActionResult ReadAndSet(Session session) 
{ 
    ActionResult retCode = ActionResult.NotExecuted; 

    System.Diagnostics.Debug.Assert(false); 

    session.Log("ReadAndSet() begins ..."); 

    string installLocation = session.CustomActionData["TARGETDIR"]; 
    string hostName = session.CustomActionData["AA"]; 
    ... 
} 
+1

¡Gracias! Este parece ser el ejemplo más claro aquí y funcionó como un encanto. –

0

Si estamos hablando de Wix Sharp (y no llanura Wix con sus cosas XML), añadiendo una propiedad personalizada es un pedazo de pastel. Todo lo que tiene que hacer es establecer la propiedad UsesProperties para su acción administrada.

Por ejemplo, si desea agregar una propiedad personalizada denominada "myprop", acaba de definir su acción como esta:

new ElevatedManagedAction(nameof(CustomActions.MyCustomAction)) 
{ 
    Condition = Condition.Installed, 
    When = When.Before, 
    Step = Step.RemoveFiles, 
    Return = Return.check, 
    Execute = Execute.deferred, 
    UsesProperties = "MYPROP" 
} 

Establecer el valor de la propiedad a través de línea de comandos msiexec:

msiexec /i my.msi MYPROP=MYVALUE 

Y luego podrá acceder a ella desde su acción personalizada:

[CustomAction] 
public static ActionResult MyCustomAction(Session session) 
{ 
    session.Log("MYPROP VALUE: " + session.CustomActionData["MYPROP"]); 
    return ActionResult.Success; 
} 

Cuando la propiedad no se establece a través de la línea de comando, el valor predeterminado será una cadena vacía.

Cuestiones relacionadas