2009-04-24 14 views
5

Come posso modificare dinamicamente una connectionString nel file app.config?Cambia app.config al momento dell'installazione

Ho un'applicazione scritta con Windows Form, C# 3.0 e Linq su Sql. Devo cambiare la stringa di connessione quando installo l'applicazione. Come faccio questo?

Quando l'utente installa il programma, deve mostrare un modulo con un'opzione per modificare la stringa di connessione se esiste o aggiungerne uno se non lo fa.

risposta

0

Check out this question. Ha ciò di cui hai bisogno per cambiare i valori in app.config in modo dinamico attraverso il codice.

+0

Stavo guardando una vecchia versione della domanda. Usando il link che ho fornito, puoi avere una schermata popup la prima volta che l'applicazione viene avviata per richiedere all'utente di cambiare le cose. –

5

Scrive un file di configurazione secondario con un blocco appSettings utilizzando le impostazioni del programma di installazione. Nel file di configurazione principale, utilizzare l'attributo di file in appsettings per fare riferimento al secondo file di configurazione, in questo modo:

<appSettings file="User.config"> 

Impostazioni nella configurazione secondaria sostituirà le chiavi corrispondenti nella configurazione principale.

Nel vostro installatore:

public override void Install(IDictionary stateSaver) 
{ 
    base.Install(stateSaver); 

    string server = Context.Parameters["Server"]; 
    string port = Context.Parameters["Port"]; 
    string targetDir = Context.Parameters["TargetDir"]; 
    // Build your connection string from user-input parameters and add them to dictionary 

    WriteAppConfig(targetDir, server, port); 
} 

private void WriteAppConfig(string targetDir, string server, string port) 
{ 
    string configFilePath = Path.Combine(targetDir, "User.config"); 

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

    userConfiguration["Server"] = server; 
    userConfiguration["Port"] = port; 

    ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 
} 

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

Penso che questa sia la risposta !! – Marshal

+0

Puoi guidarmi come dovrebbe essere il percorso dir target. Ho incluso il file User.Config direttamente nel progetto, non possiamo semplicemente scrivere User.config senza combinarlo con il percorso di destinazione. Ho provato il codice sopra .. ma non funziona. Tuttavia, non viene generato alcun errore. – Marshal

+1

@Marshal: Spiacente di non averlo visto prima, ma se ricordo correttamente, TargetDir è un parametro impostato dal programma di installazione per impostazione predefinita e dovrebbe essere impostato sulla directory di installazione. Prova a inserire alcune istruzioni di registrazione per vedere cosa Context.Parameters ["TargetDir"] è quando tenti di scrivere il file di configurazione. –

6

Se si utilizza un progetto di distribuzione .NET, in grado di raggiungere questo obiettivo utilizzando azioni personalizzate.

+0

Devo scrivere qualsiasi vbs in azioni personalizzate? Devo creare e archiviare oggetti di classi di terze parti in impostazioni al momento dell'installazione – Heena

Problemi correlati