Frage

Ich habe eine MSI-Datei mit Wxs 3.0 erstellt werden. Mein MSI verweist auf eine C # benutzerdefinierte Aktion, geschrieben mit dem neuen C # Custom Action Projekt .

Ich möchte ein Argument zu übergeben Msiexec dass meine benutzerdefinierte Aktion weitergeleitet wird - zum Beispiel:

msiexec / i MyApp.msi ENVIRONMENT = TEST #

In meiner .wxs Datei, verweise ich auf meine benutzerdefinierte Aktion wie folgt:

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

Meine C # benutzerdefinierte Aktion wird wie folgt aufgebaut:

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

}

Ich erwartete Lage sein, die Eigenschaft wie folgt zur Verfügung:

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

aber das scheint nicht zu funktionieren.

Wie kann ich die Eigenschaft, die ich in meiner benutzerdefinierten Aktion Msiexec übergeben?

War es hilfreich?

Lösung

Wenn anstelle von

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

Sie schreiben diese:

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

dann können Sie Ihre Variablen wie folgt verweisen:

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

Andere Tipps

Nur der Vollständigkeit halber; unter Verwendung des von Jeremy Lew beschriebenen Verfahren, oben im Blog des folgenden erlaubt:

Berufung:

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

Mit diesem in der .wxs-Datei:

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

Mit einer benutzerdefinierten Aktion:

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

funktioniert.

die Argumente Custom Parsing ist ziemlich hässlich, aber es funktioniert. Hoffentlich kennt jemand eine elegantere Art und Weise, dies zu tun.

Hier ist mein Arbeits Code:

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

In der C # benutzerdefinierte Aktion Funktion:

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

Ihre benutzerdefinierte Aktion muss eine verzögerte benutzerdefinierte Aktion, um nach Install zu laufen sein. Latente benutzerdefinierte Aktionen haben keinen Zugriff auf Eigenschaften, aber sie haben Zugang zu Custom. Siehe diese Blog-Post für eine Diskussion darüber, wie zu bekommen, was dagegen zu tun. (Dieses Beispiel ist eine VBScript-Aktion, aber Sie werden in der Lage, den Wert durch die session.CustomActionData Auflistung abgerufen werden.)

Wenn wir reden über Wix Sharp (und nicht schlicht Wix mit seinen XML-Sachen), eine benutzerdefinierte Eigenschaft hinzuzufügen, ist ein Stück Kuchen. Alles, was Sie tun müssen, ist UsesProperties Eigenschaft für Ihre verwalteten Aktion zu setzen.

Zum Beispiel, wenn Sie eine benutzerdefinierte Eigenschaft hinzufügen mögen den Namen " MyProp ", so definiert die Aktion wie folgt:

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

Stellen Sie den Eigenschaftswert über msiexec Befehlszeile:

msiexec /i my.msi MYPROP=MYVALUE

Und dann werden Sie in der Lage sein, darauf zuzugreifen aus Ihrer benutzerdefinierten Aktion:

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

Wenn Eigenschaft nicht über die Kommandozeile wird der Standardwert sein ein leerer String.

gesetzt
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top