2009-01-12 8 views
8

Existe-t-il un moyen, au moment de l'exécution, de remplacer une application app.config (current.config par new.config, fichier par fichier). J'ai un processus de sauvegarde/restauration qui doit remplacer son propre fichier application.exe.config. J'ai vu ceci post mais il ne répond pas comment faire ceci à l'exécution.Le basculement de app.config à l'exécution est-il possible?

Répondre

10

Il se trouve que je peux échanger le fichier .config pour le nouveau et faire un ConfigurationManager.RefreshSection (...) pour chaque section. Il va mettre à jour à partir du nouveau fichier .config.

2

Etes-vous capable de redémarrer l'application lorsque vous détectez que vous avez besoin de changer de fichiers? Si c'est le cas, il suffit de changer les fichiers et de redémarrer. Maintenant, le bit délicat est si .NET conserve le fichier app.config ouvert pendant que le programme est en cours d'exécution. Je suppose que non, mais si l'approche la plus évidente échoue, je suggère que vous ayez une deuxième application (cfgswitcher.exe) qui attend le processus avec un PID spécifié sur la ligne de commande pour terminer, puis permute les fichiers de configuration et relance le processus original. Ensuite, votre application aurait juste besoin de lancer cfgswitcher.exe (passant dans son propre PID comme un argument de ligne de commande) et se terminer. Comme je le dis bien, cela vaut la peine d'essayer l'approche la plus évidente en premier.

EDIT: Si vous ne pouvez pas redémarrer l'application (ou même une partie de celle-ci dans un nouvel AppDomain), alors divers aspects de app.config (liaisons d'assemblage, etc.) ne peuvent pas être modifiés. Si vous êtes seulement intéressé par vos propres sections de configuration, alors je vous suggère de les stocker dans un fichier de configuration séparé et de les recharger quand vous le souhaitez.

+0

Je ne parviens pas à redémarrer l'application. – maxfridbe

0

Examinez les événements disponibles dans la classe ApplicationSettingsBase. Il existe PropertyChanged & SettingChanging qui peut vous donner ce dont vous avez besoin.

Vous pouvez également regarder le fichier et s'il a changé, appelez la méthode de rechargement pour obtenir les nouveaux paramètres.

0

Je ne pense pas qu'il soit possible de changer la configuration à l'exécution sans redémarrer, donc si vous ne pouvez pas appliquer l'approche de Jon, vous devriez essayer de trouver une autre approche.

Quoi qu'il en soit, c'est peut-être juste que je n'ai pas assez d'informations sur votre scénario, mais ce genre de poisson se sent.

Etes-vous sûr qu'échanger le fichier de configuration est le meilleur moyen d'atteindre toutes les conditions requises? Je veux dire, c'est une chose assez rare. Si j'étais vous, j'essaierais de trouver une autre approche.

5

Le app.config de Microsoft .NET n'est pas conçu pour votre scénario, ainsi que de nombreux autres. Je rencontre souvent un besoin similaire, j'ai donc consacré beaucoup d'efforts à la conception d'une solution.

  1. Remaniement à utiliser app.config seulement comme bootstrap de configuration: indiquer où trouver le reste des données de configuration réelle. Cette information ne devrait presque jamais changer, il n'y a donc pas besoin de gérer le contrôle des fichiers ou les redémarrages d'applications. Choisissez un autre emplacement pour les données de configuration réelles: un fichier, une base de données, peut-être même un service Web. Je préfère une base de données la plupart du temps, donc je crée une table de configuration avec une structure simple qui me permet de stocker mes données.Implémentez une bibliothèque simple pour envelopper votre accès à la configuration afin de disposer d'une API simple pour le reste de votre application (via l'injection de dépendances). Cacher l'utilisation de app.config ainsi que votre emplacement de stockage de configuration réelle. Étant donné que .NET est fortement typé, configurez les paramètres de façon à: - convertir chaque chaîne récupérée dans le type le plus spécifique disponible (URL, Int32, FileInfo, etc.).

  2. Déterminez quels paramètres de configuration peuvent être modifiés en toute sécurité lors de l'exécution par rapport à ceux qui ne le peuvent pas. Généralement, certains paramètres doivent changer avec d'autres, ou cela n'a tout simplement aucun sens de leur permettre de changer du tout. Si toutes vos données de configuration peuvent changer en toute sécurité à l'exécution, alors cela rend les choses faciles, mais je doute fortement d'un tel scénario. Masquez la variabilité et les interdépendances des paramètres de configuration dans la mesure du possible.

  3. Concevoir la réponse à l'indisponibilité de vos données de configuration réelles. Je préfère traiter l'absence de tout paramètre de configuration comme une erreur fatale qui annule l'application, à moins que je puisse identifier un défaut utilisable. De même, j'abandonne en l'absence du conteneur de stockage de configuration (fichier, table de base de données, etc.).

Profitez, et meilleurs voeux.

Questions connexes