2009-07-28 35 views
5

Tôi đang tìm cách chuyển hướng tiêu chuẩn lớp .Net ConfigurationManager sang một tệp khác; hoàn toàn. Con đường được xác định trong thời gian chạy vì vậy Tôi không thể sử dụng configSource hoặc như vậy (đây không phải là một câu hỏi trùng lặp - Tôi đã xem xét những người khác).Chuyển hướng Cấu hìnhManager sang Tệp Khác

Tôi về cơ bản đang cố gắng sao chép những gì ASP.Net đang thực hiện phía sau trang bìa. Vì vậy, không chỉ các lớp của tôi nên đọc từ tệp cấu hình mới, mà còn bất kỳ công cụ chuẩn nào .Net (thứ mà tôi đang cố gắng để làm việc là phần tử system.codeDom).

Tôi đã mở Reflector mở và bắt đầu xem xét cách ASP.Net thực hiện nó - nó khá lông và hoàn toàn không có giấy tờ. Tôi đã hy vọng một người khác đã đảo ngược quá trình thiết kế. Không nhất thiết phải tìm kiếm một giải pháp hoàn chỉnh (sẽ tốt đẹp) nhưng chỉ đơn thuần là tài liệu .

Trả lời

9

Cuối cùng tôi đã tìm ra. Có tài liệu công khai có nghĩa là thực hiện việc này - nhưng nó bị ẩn đi trong chiều sâu của khung .Net. Thay đổi tập tin cấu hình của riêng bạn đòi hỏi sự phản ánh (không làm gì hơn làm mới ConfigurationManager); nhưng có thể thay đổi tệp cấu hình của một AppDomain mà bạn tạo thông qua các API công cộng.

Không nhờ vào tính năng Microsoft Connect tôi gửi, đây là mã:

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

Output:

customDomain: C:\my.config 
InternalConfigTest.vshost.exe: D:\Profile\...\InternalConfigTest.vshost.exe.config 
Các vấn đề liên quan