2014-05-22 9 views

risposta

6

Questa non è una soluzione perfetta ma ho impiegato due giorni per farlo funzionare e volevo condividere. Non c'è dubbio che ci saranno alcuni errori, ma ho fatto buono come posso nel tempo a disposizione:

  1. Aggiungere un nuovo progetto e selezionare un programma di installazione di Windows Installer Xml Progetto
  2. Aggiungere un nuovo progetto e selezionare un Windows Installer Xml azioni C# personalizzate del progetto
  3. nel progetto di installazione:

    • aggiungere qualcosa per essere installato ad esempio, file \ sito web ecc. (Vedi altri tutorial su come fare questo)
    • Imposta alcune proprietà nel tuo prodotto.wxs, ad es.

      <Property Id="MyProperty1" /> 
      <Property Id="MyProperty2" /> 
      
    • riferimento tue azioni di nuova creazione personalizzati (sotto) nei tuoi Product.wxs:

      <Product> ..... 
          <Binary Id='VantageInstallerCustomActions.CA.dll' src='..\VantageInstallerCustomActions\bin\$(var.Configuration)\VantageInstallerCustomActions.CA.dll' /> 
          <InstallExecuteSequence> 
           <Custom Action="SetInstallerProperties" Before="CostFinalize" /> 
          </InstallExecuteSequence> 
      </Product> 
      
      <Fragment> 
          <CustomAction Id='SetInstallerProperties' BinaryKey='VantageInstallerCustomActions.CA.dll' DllEntry='SetInstallerProperties' Return='check' Execute='immediate' /> 
      </Fragment> 
      
  4. aggiungere il seguente codice nel tuo azioni di progetto personalizzato o qualcosa di simile:

Aggiungi una classe CustomAction:

public class CustomActions 
    { 
    private static readonly InstallerPropertiesFileManager InstallerPropertiesFileManager = new InstallerPropertiesFileManager(); 

    [CustomAction] 
    public static ActionResult SetInstallerProperties(Session session) 
    { 
     session.Log("Begin SetInstallerProperties"); 

     try 
     { 

      var doc = XDocument.Load(@"C:\temp\Parameters.xml"); 

      session.Log("Parameters Loaded:" + (doc.Root != null)); 
      session.Log("Parameter Count:" + doc.Descendants("Parameter").Count()); 
      var parameters = doc.Descendants("Parameter").ToDictionary(n => n.Attribute("Name").Value, v => v.Attribute("Value").Value); 

      if (parameters.Any()) 
      { 
       session.Log("Parameters loaded into Dictionary Count: " + parameters.Count()); 

       //Set the Wix Properties in the Session object from the XML file 
       foreach (var parameter in parameters) 
       { 
        session[parameter.Key] = parameter.Value; 
       } 
      }     
      else 
      { 
       session.Log("No Parameters loaded"); 
      } 
     } 
     catch (Exception ex) 
     { 
      session.Log("ERROR in custom action SetInstallerProperties {0}", ex.ToString()); 
      return ActionResult.Failure; 
     } 
     session.Log("End SetInstallerProperties"); 
     return ActionResult.Success; 
    } 
    } 

Crea il file C: \ \ Parameters.xml Temp per memorizzare su disco

<?xml version="1.0" encoding="utf-8"?> 
    <Parameters> 
     <Environment ComputerName="Mycomputer" Description="Installation Parameters for Mycomputer" /> 
     <Category Name="WebServices"> 
      <Parameter Name="MyProperty1" Value="http://myserver/webservice" /> 
      <Parameter Name="MyProperty2" Value="myconfigSetting" /> 
     </Category> 
    </Parameters> 

N.B. non è necessario fare riferimento al Progetto azioni personalizzate dal Progetto di installazione. Inoltre, non è necessario impostare le proprietà troppo tardi nel ciclo di installazione richiesto all'inizio, ad esempio quelle che sono File Path per l'installazione dei file. Io tendo ad evitare questi.

Usa le tue proprietà nel tuo Product.wxs per fare qualcosa! per esempio. Sto usando la proprietà recuperata per aggiornare un punto di servizio end web nel web.config installato

<Fragment> 
    <DirectoryRef Id ="INSTALLFOLDER"> 
     <Component Id="WebConfig" Guid="36768416-7661-4805-8D8D-E7329F4F3AB7"> 
     <CreateFolder /> 
     <util:XmlFile Id="WebServiceEnpointUrl" Action="setValue" ElementPath="//configuration/system.serviceModel/client/endpoint[\[]@contract='UserService.V1_0.GetUser.ClientProxy.Raw.IGetUserService'[\]]/@address" Value="[MyProperty1]" File="[INSTALLFOLDER]web.config" SelectionLanguage="XPath" /> 
     </Component> 
    </DirectoryRef> 
    </Fragment> 

Come sempre con gli installatori Wix, niente funziona prima volta.Re-Costruisci la tua Wix SetupProject ed eseguire il msi a livello locale con la seguente riga di comando per attivare l'accesso:

msiexec /i "myInstaller.msi" /l*v "log.log" 

Una volta eseguito, aprire il file di log e si dovrebbe vedere i seguenti eventi:

MSI (s) (C4:3C) [11:00:11:655]: Doing action: SetInstallerProperties 
Action start 11:00:11: SetInstallerProperties. 
MSI (s) (C4:A8) [11:00:11:702]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSICD83.tmp, Entrypoint: SetInstallerProperties 
MSI (s) (C4:A8) [11:00:11:702]: Generating random cookie. 
MSI (s) (C4:A8) [11:00:11:702]: Created Custom Action Server with PID 496 (0x1F0). 
MSI (s) (C4:CC) [11:00:11:733]: Running as a service. 
MSI (s) (C4:CC) [11:00:11:733]: Hello, I'm your 32bit Impersonated custom action server. 
SFXCA: Extracting custom action to temporary directory: C:\Users\ak9763\AppData\Local\Temp\MSICD83.tmp-\ 
SFXCA: Binding to CLR version v4.0.30319 
Calling custom action VantageInstallerCustomActions!VantageInstallerCustomActions.CustomActions.SetInstallerProperties 
Begin SetInstallerProperties 
Parameters loaded into Dictionary: 2 
MSI (s) (C4!C0) [11:00:11:858]: PROPERTY CHANGE: Adding MyProperty1 property. Its value is 'http://myserver/webservice'. 
MSI (s) (C4!C0) [11:00:11:858]: PROPERTY CHANGE: Adding MyProperty2 property. Its value is 'myConfigSetting'. 
End SetInstallerProperties 
Action ended 11:00:11: SetInstallerProperties. Return value 1. 

Riferimenti per questo post:

Creating WiX Custom Actions in C# and Passing Parameters

From MSI to WiX, Part 5 - Custom actions: Introduction

Create an MSI log file

+0

Ciao sarin. Idea estremamente interessante! Probabilmente lo userò per il mio caso. L'unica domanda è: come posso ottenere il file .xml con i parametri dalla cartella locale in cui risiede il file MSI invece di codificare il percorso in C: \ temp \ Parameters.xml? C'è un modo nel codice C# dell'azione personalizzata per ottenere il percorso del file MSI che lo ha chiamato? – Ivan

+0

Se si desidera ottenere il percorso del file relativo a dove viene eseguito l'msi, vedere [questo articolo] (http://stackoverflow.com/questions/1642827/finding-my-main-executables-path-using -assemblaggio-vs-appdomain) – sarin

+0

Ciao sarin. Grazie per la risposta. Sfortunatamente non sono uno sviluppatore C#, quindi sarebbe difficile per me ottenere il percorso verso MSI. Probabilmente indicherò il percorso del file .xml in una proprietà separata come descritto [qui] (http://plainoldstan.blogspot.co.uk/2010/11/wix-set-properties-from-managed-custom.html) – Ivan

Problemi correlati