2009-12-01 11 views
9

nuevo día, nuevo problema ;-) Aún tiene problemas con la acción personalizada administrada. Ya logré llamar una acción personalizada y pasarle algunos datos de prueba. Ahora quiero reemplazar los datos de prueba con los datos reales que necesito. Y aquí comienza el problema: quiero llamar a un archivo por lotes que se instaló en un subdirectorio de mi instalación. Por lo tanto, necesito pasar la ruta de instalación a la acción personalizada. Afaik esto se puede hacer utilizando el mecanismo customactiondata. Pero esto no funciona. Cuando registro la instalación, puedo ver que fuera de la ubicación INSTALLLOCATION de customaction está apuntando a la ruta correcta, pero tan pronto como miro en el customaction la propiedad customactiondata está vacía ...WiX: Pasando Instalar ruta de acceso a la acción personalizada administrada

¿Alguien puede echar un vistazo a mi código y dame una pista de lo que estoy haciendo mal? Gracias de antemano!

módulo de combinación que llama a la acción personalizada:

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

Esquema del Proyecto de instalación que utilizan el 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; 
     } 

Respuesta

0

¿Usted ha intentado consultar la propiedad INSTALLLOCATION directamente desde dentro de la CA conseguido?

string cad = session["INSTALLLOCATION"]; 

Una de las ventajas de la utilización de DTF es que usted tiene acceso de lectura/escritura a todas las propiedades del MSI sin tener que utilizar líneas de comandos, etc Así que incluso si INSTALLLOCATION no se puede consultar como una característica normal de se podría definir su propia propiedad MSI lo establece en el valor de INSTALLOCATION y lo consulta en su CA.

+3

No si se trata de una secuencia "diferida", que es lo que está haciendo. Solo unas pocas propiedades están disponibles en secuencia diferida. –

2

Pasa el valor correctamente pero intente hacer referencia de este modo.

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

Esto debería establecer cad a la ruta de instalación como lo desee.

17

Si delinea sus datos como ...

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

Puede acceder a los datos como:

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

En el ejemplo anterior se debería utilizar:

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

entonces

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

bueno, funcionó para mí, gracias! – oldUser

+0

Tuve que hacer referencia a las propiedades con el mismo nombre de propiedad en mayúscula (por ejemplo, session.CustomActionData ["PROPERTY0"]). – Epu

5

Lo logré usando lo siguiente en.WXS archivo:

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

Y en la acción personalizada:

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

Ahora bien, todavía no he encontrado la manera de evitar la duplicación del nombre de archivo, pero esto tiene un retorno satisfactorio en el que el archivo por lotes fue instalado.

0

Después de varias horas de struglling, los siguientes trabajó para mí:

string UserDefinedInstallDir = session["INSTALLDIR"]; 

creo que sirve somenone más!

Cuestiones relacionadas