2009-07-28 3 views
5

Я ищу для перенаправления стандарт .Net ConfigurationManager класс в другой файл; полностью. Путь определяется во время выполнения, поэтому Я не могу использовать configSource или такой (это не дублированный вопрос - я посмотрел на остальные).Перенаправить ConfigurationManager в другой файл

Я по существу стараюсь дублировать то, что делает ASP.Net за крышками. Таким образом, не только мои классы должны читать из нового файла конфигурации, но и любой стандартный .Net-материал (тот, который я специально пытаюсь получить, - это элемент system.codeDom).

Я взломал Reflector и начал смотреть, как это делает ASP.Net - он довольно волосатый и полностью недокументированный. Я надеялся, что кто-то другой изменит процесс. Не обязательно искать полное решение (было бы хорошо), а просто документация.

ответ

9

Я, наконец, понял это. Существует общедоступный , зарегистрированный, для этого, но он скрыт в глубинах .Net framework. Изменение собственного конфигурационного файла требует отражения (чтобы не больше, чем обновлять ConfigurationManager); но можно изменить файл конфигурации AppDomain, созданный с помощью общедоступных API.

Нет благодаря функции Microsoft Connect я представил, вот код:

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); 
    } 
} 

Выход:

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