2014-11-24 9 views
6

Ich versuche, eine benutzerdefinierte Aktion mit „Value“ Attribut zu erstellen, möchte ich Parameter an den C# -Code passieren (die TARGETDIR und die Version).Wie übergebe ich Parameter an die benutzerdefinierte Aktion?

Allerdings bekomme ich einen Fehler, der besagt, dass DLLEntry und Wert nicht nebeneinander bestehen können. Aber die benutzerdefinierte Aktion ohne dlantry ist ungültig.

Dies ist der Code:

<CustomAction Id="SetMAWPrefferences" 
       Value="InstallDir=[TARGETDIR];Version=2.0.0.1" 
       Return="check" 
       Execute="commit" 
       BinaryKey="ImportExportBinary"      
       /> 

Und dafür bekomme ich diesen Fehler:

Error 9 ICE68: Invalid custom action type for action 'SetMAWPrefferences'.

Irgendwelche Ideen, wie es zu tun?

Antwort

3

Hinweis, Sie verwenden Value Attribut in die falsche Art und Weise:

...this attribute must be used with the Property attribute to set the property...Source


Basierend auf dem Creating WiX Custom Actions in C# and Passing Parameters Artikel sollten Sie:

  1. Erstellen Eigenschaften mit Sollwerten:

    <Property Id="InstallDir" Value="someDefaultValue" /> 
    <Property Id="Version" Value="2.0.0.1" /> 
    
  2. benutzerdefinierte Aktion Erstellen Sie die InstallDir Eigenschaft zu setzen:

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" /> 
    
  3. benutzerdefinierte Aktion erstellen:

    <CustomAction Id="SetMAWPrefferences" 
        Return="check" 
        Execute="commit" 
        BinaryKey="ImportExportBinary" 
        DllEntry="YourCustomAction" /> 
    
  4. Zeitplan benutzerdefinierte Aktionen zur Ausführung während der Installation:

    <InstallExecuteSequence> 
        <Custom Action="SetDirProp" After="CostFinalize" /> 
        <Custom Action="SetMAWPreferences" ... /> 
        ... 
    </InstallExecuteSequence> 
    
  5. Zugang diese Eigenschaften aus Ihrer benutzerdefinierten Aktion wie folgt:

    [CustomAction] 
    public static ActionResult YourCustomAction(Session session) 
    { 
        // session["InstallDir"] 
        // session["Version"] 
    } 
    
+0

Hallo die Werte werden nicht übergeben - ich bekomme null. –

+0

@ user1223457, habe ich die Antwort aktualisiert, hat es geholfen? – Yuriy

+0

Danke, die Werte sind vorbei! Allerdings bekomme ich [TARGETDIR] als Zeichenfolge, und Google ist nicht hilfreich - ich brauche den Pfad, nicht den Namen der Eigenschaft. –

18

Es gibt zwei Möglichkeiten, Parameter an den benutzerdefinierten Aktionen übergeben, wird eine für die sofortige Ausführung CA arbeiten und die andere wird für die aktiven latenten benutzerdefinierten Aktionen arbeiten.

Immediate CA (kann nicht rückgängig gemacht werden):

Um Argumente an den unmittelbaren CA passieren Sie eine Eigenschaft mit dem gewünschten Namen und greifen Sie von Ihrer Sitzung festlegen.

In Wix:

<Property Id="MyProp" Value="MyValue" /> 

In CA:

[CustomAction] 
public static ActionResult NameOfMyCA(Session session) 
{ 
    string myArg = session["MyProp"]; 
} 

Latente CA:

Um Argumente an die latenten CA Sie die CustomActionData Property verwenden müssen passieren, dieses Die Eigenschaft ist die einzige, auf die Sie von einer zurückgestellten CA zugreifen können.

Im Falle von WIX umfasst das DTF eine Custom Klasse, die ein Schlüssel/Wert-Wörterbuch ist, und Sie können es mit Zugriff:

In Wix:

<CustomAction Id="MyCustomAction" .../> 

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" /> 

In CA:

[CustomAction] 
public static ActionResult NameOfMyCA(Session session) 
{ 
    CustomActionData data = session.CustomActionData; 

    //Access each argument like this: 

    string arg1 = data["Arg1"]; 
    string arg2 = data["Arg2"]; 
    string arg3 = data["Arg3"]; 
}  

Immediate CA + Custom:

Wenn Sie die Custom für Ihre sofortige CA verwenden möchten, können Sie etwas tun:

In Wix:

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" /> 

In CA:

[CustomAction] 
public static ActionResult NameOfMyCA(Session session) 
{ 
    CustomActionData data = new CustomActionData(session["MyCustomAction"]); 

    //Access each argument like this: 

    string arg1 = data["Arg1"]; 
    string arg2 = data["Arg2"]; 
    string arg3 = data["Arg3"]; 
    string arg4 = session.Format(data["Arg4"]); 
} 

Im Fall von Arg4, da es enthält den Wert einer Eigenschaft, auf die Sie so zugreifen müssen:

Leider wird dies nur in unmittelbarer CA arbeiten, bedeutet dies, dass, wenn Sie den Wert dieser Eigenschaft in einer latenten CA verwenden möchten, müssen Sie zwei benutzerdefinierte Aktionen haben:

  • CA 1 die Custom für die festlegen CA wird als Sofort ausgeführt. (Denken Sie daran, das Grundstück mit dem gleichen Namen für die Custom definiert zu nennen.

  • CA 2 der CA mit der spezifischen Logik, die Custom verbraucht.

Ich schlage vor, Sie die Custom verwenden für alle Fälle ist, auf diese Weise Sie CA von Immediate auf latente und der Code leichter zu konvertieren ist einfacher

Referenzen zu lesen.

session.Format CustomActionData

+2

Dies sollte die akzeptierte Antwort sein. – Izzy

Verwandte Themen