Ứng dụng Cài đặt nhận giá trị từ tệp .config


172

Tôi không thể truy cập các giá trị trong tệp cấu hình.

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var clientsFilePath = config.AppSettings.Settings["ClientsFilePath"].Value; 
// the second line gets a NullReferenceException

tập tin .config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- ... -->
    <add key="ClientsFilePath" value="filepath"/>
    <!-- ... -->
  </appSettings>
</configuration>

Bạn có gợi ý gì tôi nên làm gì không?

Câu trả lời:


345

Điều này làm việc cho tôi:

string value = System.Configuration.ConfigurationManager.AppSettings[key];

6
Mã tôi cung cấp yêu cầu tệp YourProgram.exe.config tồn tại trong cùng thư mục với YourProgram.exe. Chỉ cần chắc chắn rằng nó có. Một lỗi phổ biến là sao chép tệp app.config vào thư mục đích, tệp này sẽ không hoạt động.
Adam

40
Yêu cầu thêm tài liệu tham khảo System.Configuration.
tổng kiểm tra

13
.NET 4.5 của tôi System.ConfigurationchưaConfigurationManager
qwert_ukg

3
Tôi cũng nhận được một null trong một dự án 4.5 - đã dành hai giờ cho việc này .. Phải là một lỗi.
IrishChieftain

1
Tôi cũng thấy điều này trong một ứng dụng đa mục tiêu, cấu hình lõi .net của tôi hoạt động nhưng cấu hình khung .net không (sử dụng Trình quản lý cấu hình)
Michael Brown

61

Câu trả lời mà dtsg đã đưa ra:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

NHƯNG, bạn cần thêm một tham chiếu lắp ráp vào

Cấu hình hệ thông

Chuyển đến Solution Explorer của bạn và nhấp chuột phải vào Tài liệu tham khảo và chọn Thêm tài liệu tham khảo . Chọn tab Lắp ráp và tìm kiếm Cấu hình .

Quản lý tham khảo

Đây là một ví dụ về App.config của tôi :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="AdminName" value="My Name"/>
    <add key="AdminEMail" value="MyEMailAddress"/>
  </appSettings>
</configuration>

Mà bạn có thể nhận được theo cách sau:

string adminName = ConfigurationManager.AppSettings["AdminName"];

2
Tôi dường như có cùng một vấn đề như OP. Sử dụng VS2015. Tôi không biết làm thế nào hoặc tại sao, nhưng tài liệu tham khảo của tôi về System.Configuration nói System.configuration (chữ thường).
Tim

Điều này có thể làm với việc mở rộng để bao gồm nơi không có tab "tập hợp" (ít nhất là VS2019)
Ai đóElse

21

Hãy thử đi:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

4
Việc thực hiện của bạn phải không chính xác. Điều này chắc chắn hoạt động để lấy các giá trị chính từ một tập tin cấu hình.
dtsg

Hãy chắc chắn rằng bạn thêm một tham chiếu đến System.Configuration trong các tham chiếu cho dự án của bạn!
GrahamJ

19

Đọc từ cấu hình:

Bạn sẽ cần thêm một tham chiếu đến Cấu hình

  1. Mở "Thuộc tính" trong dự án của bạn
  2. Chuyển đến tab "Cài đặt"
  3. Thêm "Tên" và "Giá trị"
  4. Nhận giá trị bằng cách sử dụng mã sau đây:
string value = Properties.Settings.Default.keyname;

Lưu vào Cấu hình:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();

4
Thực sự hữu ích vì tất cả các câu trả lời khác khi sử dụng Trình quản lý cấu hình không hoạt động nếu bạn thêm các giá trị của mình vào tab Cài đặt của các thuộc tính dự án như bạn đã mô tả. Cảm ơn.
Củ cải câm

2
Cái này cũng có tác dụng với tôi. Tôi đã nhận được một nullchuỗi với các khuyến nghị ở trên, nhưng Properties.Settings.Default.<keyName>làm việc như một cơ duyên!
dub stylee

1
Hoàn hảo ! Tôi đã tìm kiếm điều này :) Cảm ơn bạn!
HSQL

@Masoud Siahkali, Tuần trước tôi đã thử khá nhiều những gì bạn có ở đây trong dự án của riêng tôi, nhưng các giá trị, khi người dùng thay đổi trong thời gian chạy (Chỉ chạy nó từ GUI GUI bây giờ) không tồn tại trong các trường hợp. Câu hỏi của tôi: stackoverflow.com/questions/61018443/ . Vẫn chưa tìm ra lý do tại sao các thiết lập người dùng thay đổi những giá trị không kiên trì ...
Marky

8

Tôi đang dùng:

    ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
    //configMap.ExeConfigFilename = @"d:\test\justAConfigFile.config.whateverYouLikeExtension";
    configMap.ExeConfigFilename = AppDomain.CurrentDomain.BaseDirectory + ServiceConstants.FILE_SETTING;
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
    value1 = System.Configuration.ConfigurationManager.AppSettings["NewKey0"];
    value2 = config.AppSettings.Settings["NewKey0"].Value;
    value3 = ConfigurationManager.AppSettings["NewKey0"];

Trong đó value1 = ...value3 = ... cho null và value2 = ... hoạt động

Sau đó, tôi quyết định thay thế app.config nội bộ bằng:

// Note works in service but not in wpf
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"d:\test\justAConfigFile.config.whateverYouLikeExtension");
ConfigurationManager.RefreshSection("appSettings");

string value = ConfigurationManager.AppSettings["NewKey0"];

Sử dụng VS2012 .net 4


Đây chính xác là những gì tôi cần. Thực sự hữu ích, cảm ơn.
Umut OVECOGLU

5

Trong app/web.configtập tin đặt cấu hình sau:

<configuration>
  <appSettings>
    <add key="NameForTheKey" value="ValueForThisKey" />
    ... 
    ...    
  </appSettings>
...
...
</configuration>

sau đó bạn có thể truy cập mã này trong mã của mình bằng cách đặt dòng này:

string myVar = System.Configuration.ConfigurationManager.AppSettings["NameForTheKey"];

* Lưu ý rằng điều này hoạt động tốt cho .net4.5.x.net4.6.x; nhưng không làm việc cho .net core. Trân trọng: Rafael


3

Trở lại với điều này sau một thời gian dài ...

Đưa ra sự sụp đổ của Trình quản lý cấu hình, cho bất kỳ ai vẫn đang tìm kiếm câu trả lời cho lần thử này (ví dụ):

AppSettingsReader appsettingsreader = new AppSettingsReader();
string timeAsString = (string)(new AppSettingsReader().GetValue("Service.Instance.Trigger.Time", typeof(string)));

Yêu cầu System.Configuration của khóa học.

(Đã chỉnh sửa mã thành một cái gì đó thực sự hoạt động và đơn giản hơn để đọc)


Câu trả lời hay, nhưng vui lòng dọn sạch, tại sao lại tạo phiên bản mới của AppSinstallReader khi bạn tạo lại AppSinstallReader và bạn không cần truyền chuỗi, bạn chỉ có thể kết thúc chuỗi ghi đè .ToString ().
maytham-

2

Xem tôi đã làm những gì tôi nghĩ là điều rõ ràng là:

string filePath = ConfigurationManager.AppSettings.GetValues("ClientsFilePath").ToString();

Trong khi đó biên dịch nó luôn trả về null.

Điều này tuy nhiên (từ trên) hoạt động:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

2

Một số các câu trả lời có vẻ hơi ít ra IMO Dưới đây là mất của tôi vào khoảng năm 2016

<add key="ClientsFilePath" value="filepath"/>

Hãy chắc chắn rằng System.Configurationđược tham chiếu.

Câu hỏi là yêu cầu giá trị của khóa cài đặt ứng dụng

Mà chắc chắn nhất là NÊN

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Đây là một thay đổi trong đó bạn có thể nhóm các giá trị lại với nhau (không phải cho câu hỏi này)

var emails = ConfigurationManager.AppSettings[ConfigurationManager.AppSettings["Environment"] + "_Emails"];

emails sẽ là giá trị của Khóa môi trường + "_Emails"

example :   jack@google.com;thad@google.com;

2

Đối với ứng dụng web, tôi thường sẽ viết phương thức này và chỉ cần gọi nó bằng phím.

private String GetConfigValue(String key)
    {
       return System.Web.Configuration.WebConfigurationManager.AppSettings[key].ToString();
    }

1

Bạn có thể chỉ cần gõ:

string filePath = Sysem.Configuration.ConfigurationManager.AppSettings[key.ToString()];

bởi vì keylà một đối tượng và AppSettingslấy một chuỗi


1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];

1

Hoặc bạn có thể sử dụng

string value = system.configuration.ConfigurationManager.AppSettings.Get("ClientsFilePath");

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection

0

Thử nghiệm đơn giản của tôi cũng thất bại, theo lời khuyên của các câu trả lời khác ở đây - cho đến khi tôi nhận ra rằng tệp cấu hình mà tôi đã thêm vào ứng dụng máy tính để bàn của mình được đặt tên là "App1.config". Tôi đã đổi tên nó thành "App.config" và mọi thứ ngay lập tức hoạt động như mong muốn.


0
  1. Mở "Thuộc tính" trong dự án của bạn
  2. Chuyển đến tab "Cài đặt"
  3. Thêm "Tên" và "Giá trị"

MÃ SILL ĐƯỢC TỰ ĐỘNG TẠO

    <configuration>
      <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup ..." ... >
          <section name="XX....Properties.Settings" type="System.Configuration.ClientSettingsSection ..." ... />
        </sectionGroup>
      </configSections>
      <applicationSettings>
        <XX....Properties.Settings>
          <setting name="name" serializeAs="String">
            <value>value</value>
          </setting>
          <setting name="name2" serializeAs="String">
            <value>value2</value>
          </setting>
       </XX....Properties.Settings>
      </applicationSettings>
    </configuration>

Để có được một giá trị

Thuộc tính.Sinstall.Default.Name

HOẶC LÀ

Thuộc tính.Sinstall.Default ["name"]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.