Pregunta

Tengo un archivo MSI creado con Wxs 3.0. Mi MSI hace referencia a una acción personalizada de C #, escrita con el nuevo Proyecto de acción personalizada C # .

Quiero pasar un argumento a msiexec que se enruta a mi acción personalizada, por ejemplo:

msiexec / i MyApp.msi ENVIRONMENT = TEST #

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

<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 acción personalizada C # se configura así:

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

}

Esperaba poder acceder a la propiedad de esta manera:

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

pero esto no parece funcionar.

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

¿Fue útil?

Solución

Si en lugar de

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

escribes 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 podrá hacer referencia a sus variables de esta manera:

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

Otros consejos

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

Llamadas:

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 CustomActionData es bastante feo, pero funciona. Esperemos que alguien conozca una forma más elegante de hacer esto.

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 de acción personalizada C #:

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

Su acción personalizada debe ser una acción personalizada diferida para ejecutarse después de InstallFiles. Las acciones personalizadas diferidas no tienen acceso a las propiedades, pero sí tienen acceso a CustomActionData. Ver esta publicación de blog para una discusión sobre cómo saber qué hacer al respecto. (Este ejemplo es una acción personalizada de VBScript, pero podrá recuperar el valor a través de la colección session.CustomActionData).

Si estamos hablando de Wix Sharp (y no de Wix simple con su contenido XML), agregar una propiedad personalizada es pan comido. Todo lo que tiene que hacer es establecer la propiedad UsesProperties para su acción administrada.

Por ejemplo, si desea agregar una propiedad personalizada llamada " MYPROP " ;, simplemente defina su acción de esta manera:

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

Establezca el valor de la propiedad a través de la línea de comando msiexec:

msiexec /i my.msi MYPROP=MYVALUE

Y luego podrá acceder 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top