2014-12-29 39 views
6

Tôi có một app.exe.config tập tin cấu hình và phần appSettings có một cái gì đó như thế này:Viết appSettings trong tập tin bên ngoài

<configuration> 
    <appSettings configSource="app.file.config" /> 
</configuration> 

tập tin app.file.config có một cái gì đó như thế này:

<?xml version="1.0" encoding="utf-8" ?> 
<appSettings> 
    <add key="var1" value="value 1" /> 
    <add key="var2" value="value 2" /> 
    <add key="var3" value="value 3" /> 
</appSettings> 

Tôi cần chỉnh sửa var1, var2 và var3 khi chạy và tôi có mã như sau:

Configuration config = ConfigurationManager.OpenExeConfiguration("...path\app.exe); 

config.AppSettings.SectionInformation.ConfigSource = "app.file.config"; 

config.AppSettings.Settings["var1"].Value = "value 11"; 
config.AppSettings.Settings["var2"].Value = "value 22"; 
config.AppSettings.Settings["var3"].Value = "value 33"; 
config.Save(ConfigurationSaveMode.Modified); 

ConfigurationManager.RefreshSection("appSettings"); 

Khi tôi chạy config.Save .... tệp app.file.config có nút appSettings với thuộc tính là "tệp". Thuộc tính này có giá trị để app.file.config

<appSettings file="app.file.config"> 
<add key="var1" value="value 1" /> 
    <add key="var2" value="value 2" /> 
    <add key="var3" value="value 3" /> 
</appSettings> 

Bây giờ, nếu tôi cố gắng tải các tập tin cấu hình, tôi có một ngoại lệ với thông điệp " 'file' thuộc tính không được nhận. Lưu ý rằng tên thuộc tính là trường hợp nhạy cảm . " trong app.file.config.

Nếu tôi xóa thuộc tính tệp theo cách thủ công, tệp cấu hình được tải đúng cách.

Bất kỳ ý tưởng nào?

Làm cách nào để tránh ghi thuộc tính tệp khi tôi lưu tệp cấu hình.

Cảm ơn

+0

không bao giờ làm điều này, điều gì sẽ xảy ra nếu bạn bỏ qua dòng ConfigSource = "app.file.config"; – kenny

+0

Kenny, tôi không hiểu bạn. Xin vui lòng, bạn có thể giải thích chi tiết hơn? – J19

+1

điều gì sẽ xảy ra khi bạn xóa mã "config.AppSettings.SectionInformation.ConfigSource =" app.file.config ";" – kenny

Trả lời

-2

Cuối cùng, tôi đã tìm được giải pháp.

Giải pháp là để khai báo các tập tin cấu hình như thế này:

<appSettings configSource="app.file.config"> 
<add key="var1" value="value 1" /> 
    <add key="var2" value="value 2" /> 
    <add key="var3" value="value 3" /> 
</appSettings> 

Và từ mã

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
AppSettingsSection myAppSettings = config.GetSection("appSettings") 
myAppSettings.Settings["var1"].Value = "value 11"; 
config.Save(ConfigurationSaveMode.Modified); 

Lưu ý rằng tôi sử dụng GetSection ("appSettings") thay vì config.AppSettings .Settings

Nhờ tất cả những điều đó giúp mọi người trong StackOverflow.

+1

Làm thế nào loại của mình để ăn cắp từ câu trả lời của Tomer Klein và sau đó chấp nhận câu trả lời của riêng bạn. –

+0

Xin chào Christopher Painter, nó không giống nhau một cách lịch sự. Trong kịch bản của tôi, điểm mấu chốt là "AppSettingsSection myAppSettings = config.GetSection (" appSettings ")". Sử dụng GetSection là giải pháp. Nhờ Tomer Klein cho câu trả lời của mình nhưng, đối với tôi tôi cần một vài thay đổi – J19

+0

@ christoper-họa sĩ, @ j19 thực sự là một cái gì đó. Tôi nghĩ anh ấy muốn cập nhật 'app.file.config' thay vì' app.exe.config' khi lưu cài đặt theo chương trình. Ít nhất đó là những gì tôi muốn làm và thuộc tính 'configSource' thay vì' file' chính xác là cái gì, xem http://stackoverflow.com/questions/6940004/asp-net-web-config-configsource-vs -file-attributes –

11

sử dụng một tập tin cấu hình bên ngoài là trong suốt cho ứng dụng,

phần này là ok

</configuration> 
    <appSettings configSource="app.file.config" /> 
</configuration> 

và cũng này:

<?xml version="1.0" encoding="utf-8" ?> 

<appSettings> 
    <add key="var1" value="value 1" /> 
    <add key="var2" value="value 2" /> 
    <add key="var3" value="value 3" /> 
</appSettings> 

thay đổi mã của bạn để như sau:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["var1"].Value = "value 11"; 
config.Save(ConfigurationSaveMode.Modified); 
ConfigurationManager.RefreshSection("appSettings"); 

tham chiếu tệp cấu hình bên ngoài là minh bạch cho ứng dụng, để bạn không phải gọi trực tiếp. bạn có thể sử dụng phần appSetting mặc định trong trình quản lý cấu hình.

Chúc may mắn

+1

Hi Tomer Klein, Theo cách bạn đề xuất các thiết lập được lưu trữ trong app.exe.config, không phải trong app.file.config. – J19

0

CẢNH BÁO: configSource không phải là câu trả lời đúng, như được báo cáo trong các câu trả lời khác.

Bây giờ cho tin xấu ... không có tệp nào bên ngoài sẽ lưu nếu bạn cập nhật giá trị được đọc bởi ConfigurationManager.

Setup: dự án dòng lệnh tập tin app.config:

<appSettings file="AppSettings.config"> 
    <add key="test" value="MAIN" /> 
</appSettings> 

tập tin AppSettings.config với 'Sao chép vào thư mục Output' = 'Sao chép Luôn'

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

Program.cs:

 Console.WriteLine("Local Config sections"); 
     try 
     { 
      Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

      Console.WriteLine("[test]=" + config.AppSettings.Settings["test"].Value); 
      Console.WriteLine("[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     Console.WriteLine("press the ENTER key to end"); 
     Console.ReadLine(); 

TEST1 - appSettings ghi đè bởi sub-config file 'configSource'

Sắp xếp:

Thay đổi app.config để sử dụng Đạo luật

<appSettings configSource="AppSettings.config"> 

'configSource': RunProject

Khẳng định: Exception Lớn lên: "Các phần chỉ được xuất hiện một lần cho mỗi tệp cấu hình."

Test2 - appSettings ghi đè bởi sub-config file 'configSource'

Sắp xếp:

Thay đổi app.config để sử dụng 'file'

<appSettings file="AppSettings.config"> 

Đạo luật: RunProject

Xác nhận:

config.AppSettings.Settings [ "test"]. Value = ghi đè

config.AppSettings.Settings [ "testExternalOnly"]. Value = initialState

Bây giờ cho những tin tức xấu ... không ai trong số các tập tin bên ngoài sẽ tiết kiệm được nếu bạn sử dụng

config.AppSettings.Settings["test"].Value = "NEW"; 

các AppSettings sẽ chỉ lưu trong file .exe.config, và sau đó nếu bạn đóng và mở cấu hình của bạn những giá trị sẽ được ghi đè bởi các giá trị tập tin bên ngoài.

Test3 - Giá trị trong tập tin bên ngoài không được cập nhật vào 'config.Save'

Setup: Program.cs đổi thành:

Console.WriteLine("Local Config sections"); 
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

    Console.WriteLine("BEFORE[test]=" + config.AppSettings.Settings["test"].Value); 
    Console.WriteLine("BEFORE[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value); 


    config.AppSettings.Settings["test"].Value = "NEW"; 
    config.AppSettings.Settings["testExternalOnly"].Value = "NEWEXTERNAL"; 

    config.Save(ConfigurationSaveMode.Modified); 
    ConfigurationManager.RefreshSection("appSettings"); 

    //Shut current config 
    config = null; 

    //Open config 
    config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

    Console.WriteLine("AFTER[test]=" + config.AppSettings.Settings["test"].Value); 
    Console.WriteLine("AFTER[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value); 

    Console.WriteLine("AFTER CONFIG EXTERNAL FILE: " + System.IO.File.ReadAllText("AppSettings.config")); 

    Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config")); 

Đạo luật: Run Program

Khẳng định :

{myExe} .exe.phần AppSettings confg là:

<appSettings file="AppSettings.config"> 
    <add key="test" value="NEW" /> 
    <add key="testExternalOnly" value="NEWEXTERNAL" /> 
</appSettings> 

AppSettings.config là không thay đổi

Các vấn đề liên quan