2009-02-07 9 views
6

Ich habe ein Visual Studio-Setup-Projekt mit einer Installer-Klasse. In der Installer-Klasse stelle ich eine Einstellung wie folgt:Wie kann ich die Anwendungseinstellungen zur Installationszeit festlegen (über die Installer-Klasse)

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

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

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

Das Problem ist, dass, obwohl ich, dass dieser Code wissen gerade ausgeführt wird (ich andere Sachen tue), wird die Einstellung nicht gesetzt !!

Die Nachrichtenfelder schlagen vor, dass der Wert festgelegt wird, aber wenn ich in die .config-Datei gehe, ist der Wert immer noch leer!

Wer hat irgendwelche Ideen warum und/oder eine mögliche Abhilfe?

Antwort

4

Was ich für meine Installer tun, ist die Verwendung der "Datei" -Attribut in App.Config. Der appSettings Block nimmt eine „Datei“ -Attribut, etwa so:

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

Die „Datei“ -Attribut ist so etwas wie CSS, dadurch, dass die meisten spezifischen Einstellung gewinnt. Wenn Sie "foo" in user.config und App.config definiert haben, wird der Wert in user.config verwendet.

Dann habe ich einen Config-Generator, der einen zweiten appSettings-Block in user.config schreibt (oder wie immer man es nennen will), mit Werten in einem Wörterbuch.

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

Wir es, für unseren Test, Schulung und Produktionsserver verwenden, so alles, was wir tun müssen, ist an:

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(); 
      } 
     } 
    } 
} 

In Ihrem Installateur, nur so etwas wie die folgenden in Ihrer Installation Methode hinzufügen der Name und das Passwort des Rechners während der Installation, und alles ist für uns erledigt. Es war ein 3-stündiger Prozess, der mehrere Konfigurationsdateien durchlaufen hat, um Passwörter zu setzen. Jetzt ist es fast vollständig automatisiert.

Hoffe, das hilft.

+0

Danke dafür, es sieht nach der Art von Lösung aus, nach der ich suche. Obwohl ich ein Problem erlebe, wenn ich die Install-Methode in meinem Installer überschreibe, sind die Werte von der benutzerdefinierten UI nicht in den Kontextparametern enthalten. Benutze ich die richtige Methode? Prost – MrEdmundo

+0

Ignorieren, dass ich nicht die Daten von der Benutzeroberfläche im CustomActions Bearbeitungsbildschirm übergeben hatte. – MrEdmundo

0

Ich weiß ehrlich nicht, ob dies während eines Installers unterstützt wird - aber wenn es ist, stellen Sie sicher, rufen Sie Save() auf Settings.Default.

+0

Ich habe die Einstellung "Speichern" eingestellt, aber trotzdem wird der Wert nicht wirklich gesetzt! – Calanus

0

Nun, am Ende gab ich auf und hatte eine RunOnce Art von Methode, um diese Sachen nach der Installation der App zu tun.

0

Die kurze Antwort ist, dass es in Installer-Klassen nicht unterstützt wird. Sie müssen nur verstehen, dass die Methoden der Installer-Klasse von msiexec.exe aufgerufen werden, das vom Systemverzeichnis ausgeführt wird, und diese Umgebung kann möglicherweise nicht wissen, dass Sie eine Einstellungsdatei irgendwo in einem Verzeichnis haben, von der sie nichts weiß. Deshalb funktioniert es mit Code, der explizit zum Installationsort der Datei geht und ihn dort aktualisiert.