2009-02-07 7 views
6

Ho un progetto di installazione di Visual Studio che ha una classe Installer. Nella classe di installazione ho creato un ambiente come segue:Come posso impostare le impostazioni dell'applicazione al momento dell'installazione (tramite classe installatore)

 MessageBox.Show(Properties.Settings.Default.MySetting); 

     Properties.Settings.Default.MySetting = "Foo"; 
     Properties.Settings.Default.Save(); 

     MessageBox.Show(Properties.Settings.Default.MySetting); 

Il problema è che, anche se so che è in esecuzione questo codice (sto facendo altre cose), l'impostazione viene mai messo !!

Le finestre di messaggio suggeriscono che il valore viene impostato, ma quando si accede al file .config il valore è ancora vuoto!

Qualcuno ha qualche idea del perché e/o una possibile soluzione?

risposta

4

Quello che faccio per i miei installatori è utilizzare l'attributo "file" in App.Config. Il blocco appSettings prende un attributo "file", in questo modo:

<appSettings file="user.config"> 
    <add key="foo" value="some value unchanged by setup"/> 
</appSettings> 

Il "file" attributo è un po 'come CSS, in quanto le più specifiche vittorie di impostazione. Se hai "foo" definito in user.config e in App.config, viene utilizzato il valore in user.config.

Quindi, ho un generatore di configurazione che scrive un secondo blocco appSettings su user.config (o qualsiasi altra cosa si voglia chiamare), utilizzando i valori in un dizionario.

using System.Collections.Generic; 
using System.Text; 
using System.Xml; 

namespace Utils 
{ 
    public class ConfigGenerator 
    { 
     public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration) 
     { 
      using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8)) 
      { 
       xw.Formatting = Formatting.Indented; 
       xw.Indentation = 4; 
       xw.WriteStartDocument(); 
       xw.WriteStartElement("appSettings"); 

       foreach (KeyValuePair<string, string> pair in userConfiguration) 
       { 
        xw.WriteStartElement("add"); 
        xw.WriteAttributeString("key", pair.Key); 
        xw.WriteAttributeString("value", pair.Value); 
        xw.WriteEndElement(); 
       } 

       xw.WriteEndElement(); 
       xw.WriteEndDocument(); 
      } 
     } 
    } 
} 

Nel vostro installatore, basta aggiungere qualcosa di simile al seguente nel metodo Installare:

string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar); 

IDictionary<string, string> userConfiguration = new Dictionary<string, string>(); 

userConfiguration["Server"] = Context.Parameters["Server"]; 
userConfiguration["Port"] = Context.Parameters["Port"]; 

ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 

L'usiamo per i nostri test, la formazione, e server di produzione, quindi tutto quello che dobbiamo fare è specificare il nome della macchina e la password durante l'installazione, e tutto è stato curato per noi. È stato un processo di 3 ore, incluso il passaggio a più file di configurazione per impostare le password. Ora è quasi interamente automatizzato.

Spero che questo aiuti.

+0

Grazie per questo, sembra il tipo di soluzione che sto cercando. Sebbene abbia riscontrato un problema, se sovrascrivo il metodo di installazione nel mio programma di installazione, i valori dell'interfaccia utente personalizzata non sono inclusi nei parametri di contesto. Sto usando il metodo giusto? Cheers – MrEdmundo

+0

Ignora, non ho passato i dati dall'interfaccia utente nella schermata di modifica di CustomActions. – MrEdmundo

0

Sinceramente non so se questo è supportato durante un programma di installazione - ma se lo è, assicurati di chiamare Save() su Settings.Default.

+0

Ho impostato l'impostazione di salvataggio, ma nonostante ciò il valore non è stato effettivamente impostato! – Calanus

0

Bene, alla fine mi sono arreso e avevo un metodo RunOnce per eseguire questa roba dopo l'installazione dell'app.

0

La risposta breve è che non è supportato nelle classi di installazione. Devi solo capire che i metodi della classe di installazione sono chiamati da msiexec.exe in esecuzione dalla directory di sistema, e quell'ambiente non può sapere che hai un file di impostazioni da qualche parte in una directory di cui è completamente all'oscuro. Ecco perché funziona con il codice che va esplicitamente nel percorso installato del file e lo aggiorna lì.

Problemi correlati