2010-03-17 11 views
8

Je dois recharger le fichier de configuration après l'avoir modifié. Comment cela peut-il être fait en utilisant appdomains? Un échantillon de code serait utile.Rechargement du fichier de configuration .NET

+0

Est-ce que nous avons vraiment besoin de recharger le fichier de configuration après avoir quelques changements à cela!?, je ne sais pas, je demande juste, parce que je me souviens avoir lu certains où nous n'avons pas besoin de recharger. Merci! –

+0

Quel genre de programme est-ce? Service Windows? ASP.NET? –

+0

duplication possible de [Recharger les paramètres de configuration à partir d'un fichier de configuration externe pendant l'exécution] (http://stackoverflow.com/questions/4934898/reload-configuration-settings-from-an-external-config-file-during-run -time) –

Répondre

1

Oui, c'est possible ... en fonction de COMMENT comment accéder à votre fichier de configuration. Si vous comptez sur le comportement par défaut, la réponse est NO.

Toutefois, si vous accédez à la configuration via une propriété static de la méthode commune à votre projet, il est alors possible de la recharger.

Je n'ai pas l'extrait de code avec moi maintenant, mais j'ai fait quelque chose de similaire, même en utilisant un FileSystemWatcher pour détecter les changements dans le fichier config.

Il ya une mise en garde, cela ne fonctionne qu'avec les propriétés auxquelles vous accédez directement via votre code, la configuration automatique ne sera pas rechargée lorsque vous faites une telle chose.

0

J'ai effectivement trouvé la solution au problème donné. Voici les lignes Fiew de code de la façon dont cela peut être fait:

  AppDomainSetup domaininfo = new AppDomainSetup(); 

      domaininfo.ApplicationBase = System.Environment.CurrentDirectory; 
      domaininfo.ConfigurationFile = "Target_Config.exe.config"; 

      Evidence adevidence = AppDomain.CurrentDomain.Evidence; 

      AppDomain dom = AppDomain.CreateDomain("test", adevidence, domaininfo); 

      var someType =(SomeType)dom.CreateInstanceAndUnwrap("Target_Assembly", 
       "Target_Assembly.SomeType"); 

Le point clé est la classe AppDomainSetup ici, ce qui permet de définir la propriété ConfigurationFile sur l'ensemble à créer. Maintenant, nous pouvons surveiller le fichier de configuration "Target_Config.exe.config" pour les changements. Lorsqu'il est modifié, le domaine d'application créé ci-dessus doit être déchargé puis recréé.

+0

Il s'agit probablement d'une solution pour réutiliser un fichier de configuration sur plusieurs applications sans le copier pour chaque application. – Markus

7

Disons que vous avez le fichier de configuration suivante:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="test" value="1" /> 
    </appSettings> 
</configuration> 

Essayons l'approche naïve d'abord. L'application suivante va essayer de saisir la valeur du nom appSettingtest une fois par seconde, et d'imprimer sa valeur:

static void Main(string[] args) 
{ 
    while(true) 
    { 
     Console.WriteLine(ConfigurationManager.AppSettings["test"]); 
     Thread.Sleep(1000); 
    } 
} 

Mais hélas! Pendant que cela fonctionne, vous remarquerez qu'il continue à imprimer 1, et ne prend aucune modification.

Si vous mettez à jour votre code à ce qui suit, il résoudre ce problème, et il ramassera des changements à chaque modification:

static void Main(string[] args) 
{ 
    while(true) 
    { 
     ConfigurationManager.RefreshSection("appSettings"); 
     Console.WriteLine(ConfigurationManager.AppSettings["test"]); 
     Thread.Sleep(1000); 
    } 
} 
+0

Dommage que ce message n'ait pas été marqué comme réponse. J'ai tendance à préférer plus de réponses _verbose_, mais bon, c'est juste moi. –

1
ConfigurationManager.RefreshSection("configuration"); 
    Properties.Settings.Default.Reload();