2009-12-01 2 views
9

nuovo giorno, nuovo problema ;-) Devo ancora lottare con un'azione personalizzata gestita. L'ho già gestito per chiamare un'azione personalizzata e passare alcuni dati di test. Ora voglio sostituire i testdata con i dati reali di cui ho bisogno. E qui iniziano i problemi: voglio chiamare un file batch che è stato installato in una sottodirectory della mia installazione. Quindi ho bisogno di passare il percorso di installazione all'azione personalizzata. Afaik questo può essere fatto usando il mechnism customactiondata. Ma questo non funziona. Quando registro l'installazione posso vedere che al di fuori della customaction INSTALLLOCATION punta al percorso corretto, ma non appena guardo nella customaction la proprietà customactiondata è vuota ...WiX: Passare il percorso di installazione all'azione personalizzata gestita

Qualcuno può dare un'occhiata al mio codice e dammi un consiglio su cosa sto facendo male? Grazie in anticipo!

modulo di unione che richiede l'azione personalizzata:

<Module Id="DflHelpInstaller" Language="1033" Version="1.0.0.0"> 
    <Package Id="f952de58-1dc6-46b3-872a-7a49e2d9ea0a" Manufacturer="DflHelpInstaller" InstallerVersion="200" /> 

<Binary Id='RegisterDflHelpDll' SourceFile="$(var.REGISTERHELP.TargetDir)RegisterDflHelp.CA.dll" /> 

    <CustomAction Id='RegisterDflHelp' BinaryKey='RegisterDflHelpDll' DllEntry='RegisterDflHelp' Execute='deferred' /> 

    <CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='[INSTALLLOCATION]' Execute='immediate' /> 


    <InstallExecuteSequence> 
     <Custom Action='RegisterDflHelp.SetProperty' After='CostFinalize' /> 
     <Custom Action='RegisterDflHelp' After='InstallFiles' /> 
    </InstallExecuteSequence> 

    <Directory Id="TARGETDIR" Name="SourceDir"> 
     </Directory> 
    <ComponentGroupRef Id="HelpGroup"/> 

    </Module> 
</Wix> 

schema del progetto di installazione che utilizzano il MergeModule:

....

<Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder" SourceName="PFFiles"> 
<Directory Id="Company" Name='$(var.COMPANY)'> 
    <Directory Id="INSTALLLOCATION" SourceName='$var.v[SDK_VERSION]'> 
    <Component Id="MyBanner" Guid="C8C28B92-9326-4991-BFB1-BBDFDF3653AB"> 
     <File Id ="Banner.bmp" Source="Banner.bmp" KeyPath="yes" DiskId="1"/> 
    </Component> 
    <Merge Id ="DflHelpInstaller" SourceFile="DflHelpInstaller.msm" Language="1033" DiskId="1" /> 
     </Directory> 
</Directory> 

....

<Feature Id="Complete" Title="Setup" Description="Installs the SDK on your local machine." Display="expand" Level="1" ConfigurableDirectory="INSTALLLOCATION"> 
     <ComponentRef Id="Banner" /> 
     <ComponentRef Id ="UNINSTALLER"/> 
     <ComponentGroupRef Id="ReferenceGroup"/> 
     <MergeRef Id="DflHelpInstaller"/> 
</Feature> 

CustomAction:

public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult RegisterDflHelp(Session session) 
     { 
      session.Log("Begin CustomAction1"); 
      session.Log("Before Access to customactiondata"); 

      //should contain the installation path - unfortunatelly it is empty! why? 
      string cad = session["CustomActionData"]; 
      Debugger.Break(); 


      RegisterHelp(cad); 

      session.Log("End of custom action.."); 
      return ActionResult.Success; 
     } 

risposta

0

Hai provato interrogare la proprietà INSTALLLOCATION direttamente dall'interno del CA gestito?

string cad = session["INSTALLLOCATION"]; 

Una delle bellezze di utilizzare DTF è che si ha accesso in lettura/scrittura a tutte le proprietà MSI senza dover utilizzare righe di comando ecc Quindi, anche se INSTALLLOCATION non può essere interrogato come una proprietà normale si potrebbe definire la propria proprietà MSI lo imposta sul valore di INSTALLOCATION e ne richiede invece uno all'interno della CA.

+3

Non se è una sequenza "differita", che è ciò che sta facendo. Sono disponibili solo proprietà manciate in sequenza differita. –

2

Il tuo passaggio del valore correttamente, ma prova in questo modo per fare riferimento a esso.

 string[] keys = new string[session.CustomActionData.Keys.Count]; 
     session.CustomActionData.Keys.CopyTo(keys, 0); 
     string cad = keys[0]; 

Questo dovrebbe impostare cad per il percorso di installazione come si desidera.

17

Se delineate i vostri dati come ...

<CustomAction Id="MyCustomActionData" Return="check" Property="MyCustomAction" Value='PROPERTY0=[PROPERTY0];PROPERTY1=[PROPERTY1];PROPERTY2=[PROPERTY2]' Execute='immediate' /> 

È possibile accedere ai dati come:

string property0 = session.CustomActionData["Property0"]; 
string property1 = session.CustomActionData["Property1"]; 
string property2 = session.CustomActionData["Property2"]; 

Nel precedente esempio si usa:

<CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='INSTALLLOCATION=[INSTALLLOCATION]' Execute='immediate' /> 

poi

string cad = session.CustomActionData["INSTALLLOCATION"]; 
+0

bello, ha funzionato per me, grazie! – oldUser

+0

Ho dovuto fare riferimento alle proprietà con lo stesso nome di proprietà maiuscolo (ad esempio, session.CustomActionData ["PROPERTY0"]). – Epu

5

Ho realizzato questo utilizzando quanto segue in.File WXS:

<Directory Id="TARGETDIR" Name="SourceDir"> 
<Directory Id="ProgramFilesFolder" Name="PFiles"> 
    <Directory Id="ManufacturerDir" Name="Company" ShortName="Company"> 
    <Directory Id="INSTALLDIR" Name="TheApp"> 
    <Directory Id="BatchFileLocation" Name="BatchFiles"> 
    <Component Id="BatchFilesComp" ... > 
     <File Id="SomeFile_BAT" Source="BatchFiles\SomeFile.bat" Name="SomeFile.bat" ... /> 
    </Component> 
    </Directory> 
    </Directory> 
    </Directory> 
</Directory> 
</Directory> 

E l'azione personalizzata:

var batchDirectory = session.GetTargetPath("BatchFileLocation"); 
var batchFile = batchDirectory + "SomeFile.bat" 

Ora, io non ho ancora capito come evitare la duplicazione del nome del file, ma questo ritorno con successo in cui il file batch è stato installato

0

Dopo diverse ore di struglling, i seguenti ha lavorato per me:

string UserDefinedInstallDir = session["INSTALLDIR"]; 

Speranza che aiuta somenone altro!