2010-03-17 36 views
8

Tôi cần tải lại tệp cấu hình sau khi sửa đổi. Làm thế nào điều này có thể được thực hiện bằng cách sử dụng appdomains? Một mẫu mã sẽ hữu ích.Tải lại tệp cấu hình .NET

+0

Chúng ta có thực sự cần phải tải lại tập tin cấu hình sau khi thực hiện một số thay đổi cho nó!?, Tôi không biết, tôi chỉ hỏi, bởi vì tôi nhớ đọc một số nơi mà chúng ta không cần phải tải lại. Cảm ơn! –

+0

Loại chương trình này là gì? Dịch vụ Windows? ASP.NET? –

+0

có thể trùng lặp của [Tải lại cài đặt cấu hình từ tệp cấu hình bên ngoài trong thời gian chạy] (http://stackoverflow.com/questions/4934898/reload-configuration-settings-from-an-external-config-file-during-run -time) –

Trả lời

1

Có, có thể ... tùy thuộc vào CÁCH bạn truy cập tệp cấu hình của mình.

Nếu bạn dựa vào hành vi mặc định, thì câu trả lời là NO.

Tuy nhiên, nếu bạn truy cập vào cấu hình thông qua thuộc tính static của phương pháp chung cho dự án của bạn, thì bạn có thể tải lại nó.

Tôi không có đoạn mã với tôi bây giờ, nhưng tôi đã làm điều gì đó tương tự ngay cả khi sử dụng một số FileSystemWatcher để phát hiện các thay đổi trong tệp config.

Có một báo trước, nó chỉ hoạt động với các thuộc tính mà bạn truy cập trực tiếp thông qua mã của bạn, cấu hình tự động sẽ không được tải lại khi bạn làm như vậy.

0

Tôi thực sự đã tìm thấy giải pháp cho vấn đề đã cho. Dưới đây là các dòng mã fiew về cách thực hiện điều này:

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

Điểm quan trọng ở đây là lớp AppDomainSetup, cho phép thiết lập thuộc tính cấu hình trên assembly được tạo. Bây giờ, chúng ta có thể theo dõi tập tin cấu hình "Target_Config.exe.config" để thay đổi. Khi được thay đổi, tên miền ứng dụng đã tạo ở trên sẽ được tải xuống và sau đó được tạo lại.

+0

Đây có lẽ là giải pháp để tái sử dụng một tệp cấu hình trên nhiều ứng dụng mà không cần sao chép nó cho từng ứng dụng. – Markus

7

Hãy nói rằng bạn có tập tin cấu hình sau:

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

Hãy thử các cách tiếp cận ngây thơ đầu tiên. Ứng dụng sau sẽ cố gắng lấy giá trị của appSetting tên test lần mỗi giây, và in giá trị của nó:

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

Nhưng than ôi! Trong khi điều này đang chạy, bạn sẽ nhận thấy nó tiếp tục in 1 và không nhận bất kỳ thay đổi nào.

Nếu bạn cập nhật mã của bạn để những điều sau đây, nó sẽ khắc phục vấn đề này, và nó sẽ đón những thay đổi bất cứ khi nào bạn thay đổi nó:

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

Đáng tiếc, bài đăng này không được đánh dấu là câu trả lời. Tôi có xu hướng thích câu trả lời _verbose_ hơn, nhưng tốt, chỉ là tôi. –

1
ConfigurationManager.RefreshSection("configuration"); 
    Properties.Settings.Default.Reload(); 
Các vấn đề liên quan