Domanda

Ho un file MSI creato con Wxs 3.0. Il mio MSI fa riferimento a un'azione personalizzata C #, scritta usando il nuovo Progetto di azione personalizzata C # .

Voglio passare un argomento a msiexec che viene instradato alla mia azione personalizzata, ad esempio:

msiexec / i MyApp.msi ENVIRONMENT = TEST #

Nel mio file .wxs, mi riferisco alla mia azione personalizzata in questo modo:

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

La mia azione personalizzata C # è impostata in questo modo:

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

}

Mi aspettavo di poter accedere alla proprietà in questo modo:

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

ma questo non sembra funzionare.

Come posso accedere alla proprietà che ho passato a msiexec nella mia azione personalizzata?

È stato utile?

Soluzione

Se invece di

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

scrivi questo:

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

allora sarai in grado di fare riferimento alle tue variabili in questo modo:

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

Altri suggerimenti

Solo per completezza; utilizzando il metodo descritto da Jeremy Lew, nel blog sopra, si consente quanto segue:

Calling:

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

Con questo nel file .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 un'azione personalizzata:

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

opere.

L'analisi degli argomenti CustomActionData è piuttosto brutta, ma funziona. Spero che qualcuno conosca un modo più elegante per farlo.

Ecco il mio codice di lavoro:

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

Nella funzione di azione personalizzata 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"];
    ...
}

L'azione personalizzata deve essere un'azione personalizzata differita per poter essere eseguita dopo InstallFiles. Le azioni personalizzate posticipate non hanno accesso alle proprietà, ma hanno accesso a CustomActionData. Vedi questo post sul blog per una discussione su come capire cosa fare al riguardo. (Questo esempio è un'azione personalizzata VBScript, ma sarai in grado di recuperare il valore attraverso la raccolta session.CustomActionData.)

Se stiamo parlando di Wix Sharp (e non di semplice Wix con le sue cose XML), aggiungere una proprietà personalizzata è un gioco da ragazzi. Tutto quello che devi fare è impostare la proprietà UsesProperties per l'azione gestita.

Ad esempio, se desideri aggiungere una proprietà personalizzata denominata " MYPROP " ;, definisci la tua azione in questo modo:

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

Imposta il valore della proprietà tramite la riga di comando msiexec:

msiexec /i my.msi MYPROP=MYVALUE

E poi sarai in grado di accedervi dalla tua azione personalizzata:

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

Quando la proprietà non è impostata tramite riga di comando, il valore predefinito sarà una stringa vuota.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top