2009-04-24 6 views
5

Comment puis-je modifier dynamiquement une chaîne connectionString dans le fichier app.config?Modifier app.config au moment de l'installation

J'ai une application écrite avec des formulaires Windows, C# 3.0 et Linq à Sql. J'ai besoin de changer la chaîne de connexion quand j'installe l'application. Comment je fais ça? Lorsque l'utilisateur installe le programme, il doit afficher un formulaire avec une option pour changer la chaîne de connexion s'il existe ou en ajouter une si ce n'est pas le cas.

Répondre

0

Découvrez this question. Il a ce dont vous avez besoin pour changer les valeurs dans le app.config dynamiquement par le code.

+0

Je regardais une ancienne version de la question. En utilisant le lien que j'ai fourni, vous pouvez avoir un écran contextuel la première fois que l'application est lancée pour inviter l'utilisateur à changer les choses. –

5

Ecrivez un fichier de configuration secondaire avec un bloc appSettings en utilisant les paramètres du programme d'installation. Dans votre fichier de configuration principal, utilisez l'attribut de fichier dans appsettings pour référencer le deuxième fichier de configuration, comme ceci:

<appSettings file="User.config"> 

Paramètres dans la configuration secondaire remplacera toutes les clés correspondantes dans la configuration principale.

Dans votre installateur:

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

Je pense que c'est la réponse !! – Marshal

+0

Pouvez-vous me guider quel devrait être le chemin du répertoire cible. J'ai inclus le fichier User.Config directement dans le projet, nous ne pouvons pas simplement écrire User.config sans le combiner avec le chemin cible. J'ai essayé le code ci-dessus ..mais ne fonctionne pas. Cependant, il ne déclenche aucune erreur non plus. – Marshal

+1

@Marshal: Désolé, je ne l'ai pas vu auparavant, mais si je me souviens bien, TargetDir est un paramètre défini par le programme d'installation par défaut, et il doit être défini dans le répertoire d'installation. Essayez de lancer quelques instructions de journalisation pour voir ce que Context.Parameters ["TargetDir"] est lorsque vous essayez d'écrire le fichier de configuration. –

6

Si vous utilisez un projet de déploiement .NET, peut le faire en utilisant des actions personnalisées.

+0

Ai-je besoin d'écrire des vbs dans des actions personnalisées? Je dois créer et stocker l'objet de la classe tierce dans les paramètres au moment de l'installation – Heena

Questions connexes