AppSettings mendapatkan nilai dari file .config

172

Saya tidak dapat mengakses nilai dalam file konfigurasi.

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

file .config :

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

Apakah Anda punya saran apa yang harus saya lakukan?

Mat
sumber

Jawaban:

345

Ini bekerja untuk saya:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Adam
sumber
6
Kode yang saya berikan memerlukan file YourProgram.exe.config agar ada di folder yang sama dengan YourProgram.exe. Pastikan itu ada di sana. Kesalahan umum adalah menyalin file app.config ke direktori tujuan, yang tidak akan berfungsi.
Adam
40
Perlu menambahkan referensi System.Configuration.
checksum
13
NET. 4,5 saya System.ConfigurationbelumConfigurationManager
qwert_ukg
3
Saya juga mendapatkan nol dalam proyek 4,5 - menghabiskan dua jam untuk ini .. Harus menjadi bug.
IrishChieftain
1
Saya juga melihat ini dalam aplikasi multi-target, konfigurasi .net core saya berfungsi tetapi konfigurasi .net framework tidak (menggunakan ConfigurationManager)
Michael Brown
61

Jawaban yang diberikan dtsg bekerja:

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

NAMUN, Anda perlu menambahkan referensi perakitan untuk

Sistem konfigurasi

Buka Solution Explorer Anda dan klik kanan pada Referensi dan pilih Tambahkan referensi . Pilih tab Assemblies dan cari Configuration .

Manajer referensi

Ini adalah contoh dari App.config saya :

<?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>

Yang bisa Anda dapatkan dengan cara berikut:

string adminName = ConfigurationManager.AppSettings["AdminName"];
rotgers
sumber
2
Saya tampaknya memiliki masalah yang sama dengan OP. Menggunakan VS2015. Saya tidak tahu bagaimana atau mengapa, tetapi referensi saya untuk System.Configuration mengatakan System.configuration (huruf kecil).
Tim
Ini bisa dilakukan dengan explanding untuk menutupi di mana tidak ada tab "majelis" (setidaknya VS2019)
SomeoneElse
21

Coba ini:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
sumber
4
Implementasi Anda harus salah. Ini jelas berfungsi untuk mengambil nilai kunci dari file konfigurasi.
dtsg
Pastikan Anda menambahkan referensi ke System.Configuration dalam referensi untuk proyek Anda!
GrahamJ
19

Baca Dari Konfigurasi:

Anda harus menambahkan referensi ke Konfigurasi

  1. Buka "Properties" di proyek Anda
  2. Buka Tab "Pengaturan"
  3. Tambahkan "Nama" dan "Nilai"
  4. Dapatkan Nilai dengan menggunakan kode berikut:
string value = Properties.Settings.Default.keyname;

Simpan ke Konfigurasi:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Masoud Siahkali
sumber
4
Sangat membantu karena semua jawaban lain menggunakan ConfigurationManager tidak berfungsi jika Anda menambahkan nilai-nilai Anda di tab Pengaturan dari properti proyek seperti yang telah Anda jelaskan. Terima kasih.
The Dumb Radish
2
Ini juga bekerja untuk saya. Saya mendapatkan nullstring dengan rekomendasi di atas, tetapi Properties.Settings.Default.<keyName>bekerja seperti pesona!
dub stylee
1
Sempurna! Saya mencari ini :) Terima kasih!
HSQL
@ Masoud Siahkali, Minggu lalu saya mencoba cukup banyak apa yang Anda miliki di sini di proyek saya sendiri, tetapi nilai-nilai, ketika diubah oleh pengguna pada waktu berjalan (Hanya menjalankannya dari VS GUI untuk saat ini) tidak bertahan di seluruh instance. Pertanyaan saya: stackoverflow.com/questions/61018443/… . Masih belum menemukan alasan mengapa pengaturan yang diubah oleh pengguna dari nilai-nilai tersebut tidak bertahan ...
marky
8

Saya menggunakan:

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

Di mana value1 = ... dan value3 = ... memberikan null dan value2 = ... berfungsi

Kemudian saya memutuskan untuk mengganti app.config internal dengan:

// 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"];

Menggunakan VS2012 .net 4

Kkloe
sumber
Inilah yang saya butuhkan. Sangat membantu, terima kasih.
Umut OVECOGLU
5

Di app/web.configfile atur konfigurasi berikut:

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

maka Anda dapat mengakses ini dalam kode Anda dengan memasukkan baris ini:

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

* Perhatikan bahwa ini berfungsi dengan baik untuk .net4.5.xdan .net4.6.x; tetapi tidak bekerja untuk .net core. Salam, Rafael

Rafael Andrs Cspedes Basterio
sumber
3

Kembali ke yang ini setelah waktu yang lama ...

Mengingat matinya ConfigurationManager, bagi siapa pun yang masih mencari jawaban untuk percobaan ini (misalnya):

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

Membutuhkan System.Configuration tentu saja.

(Mengedit kode ke sesuatu yang benar-benar berfungsi dan lebih mudah dibaca)

Mike Dean
sumber
Jawaban yang bagus, tapi tolong bersihkan, mengapa membuat instance AppSettingsReader yang baru saat Anda membuat kembali AppSettingsReader lagi, dan Anda tidak perlu membuang string, Anda bisa mengakhirinya ke .ToString () menimpa.
maytham-ɯɐɥʇʎɐɯ
2

Melihat saya melakukan apa yang saya pikir adalah hal yang jelas adalah:

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

Sementara itu kompilasi selalu mengembalikan nol.

Namun ini (dari atas) berfungsi:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
Steve
sumber
2

Beberapa Jawaban tampaknya sedikit tidak aktif dari IMO Inilah yang saya ambil sekitar tahun 2016

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

Pastikan System.Configurationdireferensikan.

Pertanyaan adalah menanyakan nilai kunci pengaturan aplikasi

Yang pasti HARUS

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Berikut ini adalah twist di mana Anda dapat mengelompokkan nilai bersama (bukan untuk pertanyaan ini)

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

emails akan menjadi nilai Kunci Lingkungan + "_Emails"

example :   jack@google.com;thad@google.com;
Tom Stickel
sumber
2

Untuk aplikasi web, saya biasanya akan menulis metode ini dan cukup menyebutnya dengan kunci.

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

Anda cukup mengetik:

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

karena keymerupakan objek dan AppSettingsmengambil string

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

Atau Anda bisa menggunakan

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

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
Davit Mikuchadze
sumber
0

Tes sederhana saya juga gagal, mengikuti saran dari jawaban lain di sini - sampai saya menyadari bahwa file konfigurasi yang saya tambahkan ke aplikasi desktop saya diberi nama "App1.config". Saya menamainya menjadi "App.config" dan semuanya segera berfungsi sebagaimana mestinya.

BCA
sumber
0
  1. Buka "Properties" di proyek Anda
  2. Buka Tab "Pengaturan"
  3. Tambahkan "Nama" dan "Nilai"

KODE AKAN DIHASILKAN SECARA OTOMATIS

    <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>

Untuk mendapatkan nilai

Properties.Settings.Default.Name

ATAU

Properti.Settings.Fault ["name"]

Hakan
sumber