2009-07-28 12 views
5

Je cherche à rediriger le standard classe .Net ConfigurationManager vers un autre fichier; entièrement. Le chemin est déterminé à l'exécution donc Je ne peux pas utiliser configSource ou autre (ce n'est pas une question en double - j'ai regardé les autres).Rediriger ConfigurationManager vers un autre fichier

Je tente essentiellement de reproduire ce que fait ASP.Net derrière les couvertures. Ainsi, non seulement mes classes devraient lire à partir du nouveau fichier de configuration, mais aussi tout ce qui est standard .Net (celui que j'essaie spécifiquement de faire fonctionner est l'élément system.codeDom).

J'ai ouvert le réflecteur et commencé à regarder comment ASP.Net le fait - c'est assez poilu et complètement non documenté. J'espérais que quelqu'un d'autre a inversé le processus. Pas nécessairement à la recherche d'une solution complète (ce serait bien) mais simplement documentation.

Répondre

9

J'ai finalement compris. Il y a un documenté documenté pour le faire - mais il est caché dans les profondeurs de la structure .Net. Changer votre propre fichier de configuration nécessite une réflexion (pour ne pas faire plus que rafraîchir le ConfigurationManager); mais il est possible de modifier le fichier de configuration d'un AppDomain que vous créez via des API publiques.

Non merci à Microsoft Connect fonctionnalité que je soumettais, voici le code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Setup information for the new appdomain. 
     AppDomainSetup setup = new AppDomainSetup(); 
     setup.ConfigurationFile = "C:\\my.config"; 

     // Create the new appdomain with the new config. 
     AppDomain d2 = AppDomain.CreateDomain("customDomain", AppDomain.CurrentDomain.Evidence, setup); 

     // Call the write config method in that appdomain. 
     CrossAppDomainDelegate del = new CrossAppDomainDelegate(WriteConfig); 
     d2.DoCallBack(del); 

     // Call the write config in our appdomain. 
     WriteConfig(); 

     Console.ReadLine(); 
    } 

    static void WriteConfig() 
    { 
     // Get our config file. 
     Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

     // Write it out. 
     Console.WriteLine("{0}: {1}", AppDomain.CurrentDomain.FriendlyName, c.FilePath); 
    } 
} 

Sortie:

customDomain: C:\my.config 
InternalConfigTest.vshost.exe: D:\Profile\...\InternalConfigTest.vshost.exe.config 
Questions connexes