2014-11-24 8 views
6

Próbuję utworzyć niestandardową akcję z atrybutem "Wartość", chcę przekazać parametry do kodu C# (TARGETDIR i wersja).Jak przekazać parametry do niestandardowej akcji?

Jednak pojawia się błąd stwierdzający, że DLLENtry i Value nie mogą współistnieć. Ale niestandardowa akcja bez dllentry jest nieważna.

Jest to kod:

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

I za to dostaję ten błąd:

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

Jakieś pomysły jak to zrobić?

Odpowiedz

3

Uwaga, używasz atrybut Value w niewłaściwy sposób:

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


Na podstawie artykułu Creating WiX Custom Actions in C# and Passing Parameters należy:

  1. Tworzenie właściwości pożądanych wartości:

    <Property Id="InstallDir" Value="someDefaultValue" /> 
    <Property Id="Version" Value="2.0.0.1" /> 
    
  2. Tworzenie niestandardowych działań, aby ustawić właściwość InstallDir:

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" /> 
    
  3. Tworzenie niestandardowego działania:

    <CustomAction Id="SetMAWPrefferences" 
        Return="check" 
        Execute="commit" 
        BinaryKey="ImportExportBinary" 
        DllEntry="YourCustomAction" /> 
    
  4. Harmonogram akcji niestandardowych do wykonania podczas procesu instalacji:

    <InstallExecuteSequence> 
        <Custom Action="SetDirProp" After="CostFinalize" /> 
        <Custom Action="SetMAWPreferences" ... /> 
        ... 
    </InstallExecuteSequence> 
    
  5. Dostępu te właściwości z niestandardowej akcji w następujący sposób:

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

Cześć te wartości nie przemijają - otrzymuję zero. –

+0

@ user1223457, zaktualizowałem odpowiedź, czy to pomogło? – Yuriy

+0

Dziękuję, wartości przemijają! jednak otrzymuję [TARGETDIR] jako ciąg, a Google nie jest pomocny - potrzebuję ścieżki, a nie nazwy własności. –

18

Istnieją dwa sposoby, aby przekazać parametry do działań niestandardowych, będzie jedną pracę do natychmiastowego wykonania CA a druga będzie działać na odroczony działań niestandardowych.

Natychmiastowe CA (nie może być wycofana):

Aby przekazywać argumenty do natychmiastowego CA można ustawić właściwość wymaganą nazwę i do niego dostęp z sesji.

W Wix:

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

W Kalifornia:

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

odroczony CA:

Aby przekazywać argumenty odroczonego CA trzeba użyć CustomActionData Property, tym Właściwość jest jedyną, do której można uzyskać dostęp z odroczonego urzędu certyfikacji.

W przypadku WIX The DTF obejmuje klasę CustomActionData który jest słownikiem klucz/wartość, i masz do niego dostęp za pomocą:

W Wix:

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

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

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

Natychmiastowe CA + CustomActionData:

Jeśli chcesz użyć CustomActionData do natychmiastowego CA można zrobić coś takiego:

W Wix:

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

w 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"]); 
} 

W przypadku Arg4 ponieważ zawiera wartość nieruchomości, do której musisz uzyskać dostęp w następujący sposób:

string arg4 = session.Format(data["Arg4"]); 

Niestety to będzie działać tylko w bezpośrednim CA, oznacza to, że jeśli chcesz użyć wartości tej właściwości w odroczonym CA trzeba będzie mieć dwa niestandardowe działania:

  • CA 1, aby ustawić CustomActionData dla CA wykonany jako natychmiastowy. (Pamiętaj, aby wymienić się z obiektem tej samej nazwie zdefiniowanej dla CustomAction.

  • CA 2 CA ze specyficzną logikę, która zużywa CustomActionData.

Proponuję użyć CustomActionData dla wszystkich przypadkach ten sposób jest łatwiejszy do konwersji Ci CA przed natychmiastowym odroczonego a kod jest czytelniejszy

Referencje:.

session.Format CustomActionData

+2

To powinna być zaakceptowana odpowiedź. – Izzy

Powiązane problemy