2009-07-28 6 views
5

Ich bin auf der Suche nach der Standard .Net ConfigurationManager-Klasse in eine andere Datei umleiten; vollständig. Der Pfad wird zur Laufzeit so bestimmt Ich kann nicht configSource oder so verwenden (das ist keine doppelte Frage - ich habe mir die anderen angeschaut).Redirect ConfigurationManager zu einer anderen Datei

Ich versuche im Wesentlichen zu kopieren, was ASP.Net hinter den Abdeckungen tut. Daher sollten nicht nur meine Klassen aus der neuen Konfigurationsdatei lesen, sondern auch alle Standard-.Net-Sachen (die ich gerade versuche, zu arbeiten ist das system.codeDom-Element).

Ich habe Reflector geknackt und angefangen zu sehen, wie ASP.Net es tut - es ist ziemlich haarig und völlig undokumentiert. Ich hatte gehofft, dass jemand anders den Prozess rückgängig gemacht hat. Nicht notwendigerweise auf der Suche nach einer vollständigen Lösung (wäre nett), sondern nur Dokumentation.

Antwort

9

Ich habe es endlich herausgefunden. Es gibt eine öffentliche dokumentiert bedeutet, dies zu tun - aber es ist in den Tiefen des. NET-Framework versteckt. Das Ändern Ihrer eigenen Konfigurationsdatei erfordert eine Reflektion (um lediglich den ConfigurationManager zu aktualisieren); Es ist jedoch möglich, die Konfigurationsdatei einer AppDomain zu ändern, die Sie über öffentliche APIs erstellen.

Keine dank der Microsoft Connect-Funktion I, hier vorgelegten ist der 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); 
    } 
} 

Ausgang:

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