Come si scrive un programma di installazione Wix che importa i valori dei parametri da un file XML da utilizzare durante l'installazione?Azioni personalizzate Wix - Lettura dei parametri da un file XML
risposta
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:
- Aggiungere un nuovo progetto e selezionare un programma di installazione di Windows Installer Xml Progetto
- Aggiungere un nuovo progetto e selezionare un Windows Installer Xml azioni C# personalizzate del progetto
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>
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
Una soluzione è quella di utilizzare il "Community MSI Extensions"
L'azione personalizzata che cercate è probabilmente Xml_SelectNodeValue (c'è un esempio su come usarlo).
- 1. Lettura di un valore xml in una proprietà per Wix
- 2. WIX, il debug delle azioni personalizzate non funziona
- 3. Porting di azioni di installazione personalizzate su Wix
- 4. Wix C# Registrazione delle azioni personalizzate non funzionante
- 5. lettura dei dati da XML in un array
- 6. Lettura XML da Stream
- 7. Lettura del file xml da una risorsa
- 8. È possibile aggiungere parametri alle azioni di amministrazione personalizzate Django?
- 9. Modifica dei testi XML da un file XML usando Python
- 10. Lettura da un file app.config
- 11. StreamReader e lettura di un file XML
- 12. Inserimento di azioni personalizzate tra finestre di dialogo (InstallUISequence) in WiX
- 13. Azioni personalizzate in Django Admin
- 14. Lettura di un file XML utilizzando QXmlStreamReader
- 15. lettura file xml con vbscript
- 16. Azioni personalizzate VoiceOver in UITableViewCell
- 17. Android Wear Azioni vocali personalizzate
- 18. Lettura e visualizzazione dei dati da un file .txt
- 19. WIX Office Detection Extension
- 20. In WiX, è possibile aggiornare il testo di stato quando si eseguono azioni personalizzate?
- 21. azioni personalizzate all'interno di rails_admin gem
- 22. C# Lettura PCL da file
- 23. Azioni personalizzate nell'app Contatti (simile a G +)
- 24. lettura di un file XML in un programma C++
- 25. Lettura e XML scrittura di file
- 26. Lettura da file
- 27. Eliminazione di elementi XML in WiX
- 28. lettura di un documento XML con LINQ
- 29. Lettura valori distinti da XML utilizzando XPath
- 30. Comprime i file durante la lettura dei dati da STDIN
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
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
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