Come è possibile impostare le impostazioni delle applicazioni al momento dell'installazione (via class installer)

StackOverflow https://stackoverflow.com/questions/523619

  •  22-08-2019
  •  | 
  •  

Domanda

Ho un progetto di installazione di Visual Studio che ha una classe Installer. Nella classe di installazione ho creato un ambiente nel seguente modo:

       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 è stato impostato, ma quando vado al .config depositare il valore è ancora vuota!

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

È stato utile?

Soluzione

Quello che faccio per i miei installatori è quello di 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>

L'attributo "file" è un po 'come CSS, in quanto le più specifiche vittorie di impostazione. Se si dispone di "pippo" definito nella user.config così come App.config, viene utilizzato il valore in user.config.

Poi, ho un generatore di configurazione che scrive una seconda appsettings blocco a user.config (o come volete chiamarlo), 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 server di test, di formazione e di produzione, così tutto quello che dobbiamo fare è specificare il nome della macchina e la password durante l'installazione, e curato di tutto ciò di per noi. Ha usato per essere un processo di 3 ore, tra cui andare attraverso più file di configurazione per impostare le password. Ora è quasi completamente automatizzato.

Spero che questo aiuti.

Altri suggerimenti

Bene, alla fine ho rinunciato e ha avuto un tipo RunOnce di metodo per fare questa roba dopo l'applicazione è stata installata.

Onestamente non so se questo è supportato durante un programma di installazione -. Ma se lo è, assicurarsi che si sta chiamando Save() su Settings.Default

La risposta breve è che non è supportato in classi di installazione. Hai solo bisogno di capire che i metodi della classe di installazione sono chiamati da msiexec.exe va dalla directory di sistema, e che l'ambiente non puoi sapere che avete un file di impostazioni da qualche parte in una directory che è completamente all'oscuro. Ecco perché funziona con il codice che va esplicitamente la posizione di installazione del file e aggiorna lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top