Question

Un fichier MSI est créé avec Wxs 3.0. Mon MSI fait référence à une action personnalisée C #, écrite à l'aide du nouveau Projet d'action personnalisée C # .

Je souhaite passer un argument à msiexec qui est routé vers mon action personnalisée - par exemple:

msiexec / i MyApp.msi ENVIRONMENT = TEST #

Dans mon fichier .wxs, je fais référence à mon action personnalisée comme suit:

<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>

L'action personnalisée Mon C # est configurée comme suit:

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

}

Je m'attendais à pouvoir accéder à la propriété de la manière suivante:

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

mais cela ne semble pas fonctionner.

Comment accéder à la propriété que j'ai transmise à msiexec dans mon action personnalisée?

Était-ce utile?

La solution

Si au lieu de

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

vous écrivez ceci:

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

alors vous pourrez référencer vos variables comme ceci:

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

Autres conseils

Juste pour être complet; En utilisant la méthode décrite par Jeremy Lew, le blog ci-dessus permet de:

Appel:

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

Avec ceci dans le fichier .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>

Avec une action personnalisée:

    /// <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(',');
    }

fonctionne.

L'analyse des arguments CustomActionData est plutôt moche, mais cela fonctionne. Espérons que quelqu'un connaisse un moyen plus élégant de le faire.

Voici mon code de travail:

<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>

Dans la fonction d'action personnalisée 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"];
    ...
}

Votre action personnalisée doit être une action personnalisée différée pour pouvoir être exécutée après InstallFiles. Les actions personnalisées différées n'ont pas accès aux propriétés, mais elles ont également accès à CustomActionData. Voir cet article de blog pour une discussion sur la façon d’obtenir des solutions. (Cet exemple est une action personnalisée de VBScript, mais vous pourrez récupérer la valeur via la collection session.CustomActionData.)

Si nous parlons de Wix Sharp (et non de Wix ordinaire avec son contenu XML), ajouter une propriété personnalisée est un jeu d’art. Il vous suffit de définir la propriété UsesProperties pour votre action gérée.

Par exemple, si vous souhaitez ajouter une propriété personnalisée nommée " MYPROP ", définissez simplement votre action comme suit:

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

Définissez la valeur de la propriété via la ligne de commande msiexec:

msiexec /i my.msi MYPROP=MYVALUE

Ensuite, vous pourrez y accéder à partir de votre action personnalisée:

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

Lorsque la propriété n'est pas définie via la ligne de commande, la valeur par défaut sera une chaîne vide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top