AppSettings รับค่าจากไฟล์. config


172

ฉันไม่สามารถเข้าถึงค่าในไฟล์กำหนดค่า

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

ไฟล์ .config :

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

คุณมีข้อเสนอแนะอะไรฉันควรทำอย่างไร

คำตอบ:


345

สิ่งนี้ใช้ได้กับฉัน:

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

6
รหัสที่ฉันให้ต้องมีไฟล์ YourProgram.exe.config อยู่ในโฟลเดอร์เดียวกับ YourProgram.exe เพียงแค่ทำให้แน่ใจว่ามี ข้อผิดพลาดทั่วไปคือการคัดลอกไฟล์ app.config ไปยังไดเรกทอรีปลายทางซึ่งจะไม่ทำงาน
อดัม

40
System.Configurationจำเป็นต้องมีการอ้างอิงเพิ่ม
checksum

13
. NET 4.5 ของฉันSystem.Configurationยังไม่มีConfigurationManager
qwert_ukg

3
ฉันยังได้รับโมฆะในโครงการ 4.5 - ใช้เวลาสองชั่วโมงในการนี้ .. จะต้องมีข้อผิดพลาด
IrishChieftain

1
ฉันก็เห็นสิ่งนี้ในแอปพลิเคชันที่มีเป้าหมายหลายตัวการกำหนดค่า. net core ของฉันทำงานได้ แต่การกำหนดค่า. NET Framework ไม่ได้ (โดยใช้ ConfigurationManager)
Michael Brown

61

คำตอบที่ dtsg ให้ผลงาน:

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

แต่คุณจะต้องเพิ่มอ้างอิงประกอบการ

System.Configuration

ไปที่งานโซลูชัน Explorerและคลิกขวาบนอ้างอิงและเลือกเพิ่มการอ้างอิง เลือกประกอบแท็บและค้นหาการกำหนดค่า

ผู้จัดการอ้างอิง

นี่คือตัวอย่างของApp.configของฉัน:

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

ซึ่งคุณจะได้รับในวิธีต่อไปนี้:

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

2
ฉันดูเหมือนจะมีปัญหาเช่นเดียวกับ OP ใช้ VS2015 ฉันไม่ทราบว่าเป็นอย่างไรหรือทำไม แต่การอ้างอิงถึง System.Configuration พูดว่าSystem.configuration (ตัวพิมพ์เล็ก)
ทิม

สิ่งนี้สามารถทำได้ด้วยการอธิบายเพื่อให้ครอบคลุมที่ไม่มีแท็บ "ชุดประกอบ" (อย่างน้อย VS2019)
SomeoneElse

21

ให้มันเป็นไป:

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

4
การดำเนินการของคุณต้องไม่ถูกต้อง วิธีนี้ใช้สำหรับดึงค่าคีย์จากไฟล์ปรับแต่ง
dtsg

ตรวจสอบให้แน่ใจว่าคุณเพิ่มการอ้างอิงถึง System.Configuration ในการอ้างอิงสำหรับโครงการของคุณ!
GrahamJ

19

อ่านจากการกำหนดค่า:

คุณจะต้องเพิ่มการอ้างอิงไปยัง Config

  1. เปิด "Properties" ในโครงการของคุณ
  2. ไปที่แท็บ "การตั้งค่า"
  3. เพิ่ม "ชื่อ" และ "ค่า"
  4. รับค่าด้วยการใช้รหัสต่อไปนี้:
string value = Properties.Settings.Default.keyname;

บันทึกในการกำหนดค่า:

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

4
มีประโยชน์จริง ๆ เพราะคำตอบอื่น ๆ ทั้งหมดที่ใช้ ConfigurationManager ไม่ทำงานหากคุณเพิ่มค่าของคุณในแท็บการตั้งค่าของคุณสมบัติโครงการตามที่คุณได้อธิบายไว้ ขอบคุณ
หัวไชเท้าโง่

2
สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน ฉันได้รับnullสตริงพร้อมคำแนะนำข้างต้น แต่Properties.Settings.Default.<keyName>ทำงานเหมือนมีเสน่ห์!
30725 dub stylee

1
สมบูรณ์แบบ! ฉันกำลังมองหาสิ่งนี้ :) ขอบคุณ!
HSQL

@Masoud Siahkali เมื่อสัปดาห์ที่แล้วฉันพยายามทำสิ่งที่คุณมีอยู่ในโครงการของตัวเอง แต่คุณค่าเมื่อผู้ใช้เปลี่ยนไปเมื่อใช้งานจริง คำถามของฉัน: stackoverflow.com/questions/61018443/... ยังไม่ได้คิดออกว่าทำไมการตั้งค่าที่เปลี่ยนแปลงโดยผู้ใช้ของค่าเหล่านั้นไม่คงอยู่ ...
marky

8

ฉันใช้:

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

โดยที่value1 = ...และvalue3 = ...ให้ null และvalue2 = ...ทำงาน

จากนั้นฉันตัดสินใจเปลี่ยนแอพภายในกำหนดค่าด้วย:

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

ใช้ VS2012 .net 4


นี่คือสิ่งที่ฉันต้องการ มีประโยชน์จริงๆขอบคุณ
Umut OVECOGLU

5

ในapp/web.configไฟล์ตั้งค่าการกำหนดค่าต่อไปนี้:

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

จากนั้นคุณสามารถเข้าถึงสิ่งนี้ในรหัสของคุณโดยใส่ในบรรทัดนี้:

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

* โปรดทราบว่านี่ใช้งานได้ดี.net4.5.xและ.net4.6.x; .net coreแต่ไม่ได้ทำงานให้กับ ขอแสดงความนับถือ: ราฟาเอล


3

กลับมาที่นี่หลังจากผ่านไปนาน ...

เมื่อกำหนดอนิจกรรมของ ConfigurationManager สำหรับทุกคนที่กำลังมองหาคำตอบสำหรับความพยายามนี้ (ตัวอย่าง):

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

ต้องมีการกำหนดค่าระบบแน่นอน

(แก้ไขรหัสเป็นสิ่งที่ใช้งานได้จริงและอ่านง่ายกว่า)


คำตอบที่ดี แต่โปรดทำความสะอาดทำไมสร้างอินสแตนซ์ใหม่ของ AppSettingsReader เมื่อคุณสร้าง AppSettingsReader อีกครั้งอีกครั้งและคุณไม่จำเป็นต้องแปลงสตริงคุณสามารถจบมันเป็น. ToString ()
maytham-ɯɐɥʇʎɐɯ

2

เห็นฉันทำในสิ่งที่ฉันคิดว่าเป็นสิ่งที่ชัดเจนคือ:

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

ในขณะที่การรวบรวมนั้นจะส่งกลับ null เสมอ

อย่างไรก็ตามงานนี้ (จากด้านบน):

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

2

คำตอบบางอย่างดูเหมือนจะปิดไปเล็กน้อยIMO นี่คือการเข้าร่วมครั้งที่2016ของฉัน

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

ตรวจสอบให้แน่ใจว่าSystem.Configurationมีการอ้างอิง

คำถามกำลังถามถึงคุณค่าของการตั้งค่าคีย์การตั้งค่า

ซึ่งแน่นอนที่สุดควรเป็น

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

นี่คือการบิดที่คุณสามารถจัดกลุ่มค่าร่วมกัน (ไม่ใช่สำหรับคำถามนี้)

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

emails จะเป็นค่าของ Environment Key + "_Emails"

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

2

สำหรับเว็บแอพพลิเคชั่นปกติผมจะเขียนวิธีนี้และเรียกมันด้วยกุญแจ

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



1

หรือคุณสามารถใช้

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

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

0

การทดสอบแบบง่าย ๆ ของฉันล้มเหลวด้วยการทำตามคำแนะนำของคำตอบอื่น ๆ ที่นี่ - จนกว่าฉันจะรู้ว่าไฟล์ปรับแต่งที่ฉันเพิ่มไปยังแอปพลิเคชันเดสก์ท็อปของฉันได้รับชื่อ "App1.config" ฉันเปลี่ยนชื่อเป็น "App.config" และทุกอย่างทำงานได้ทันทีตามที่ควร


0
  1. เปิด "Properties" ในโครงการของคุณ
  2. ไปที่แท็บ "การตั้งค่า"
  3. เพิ่ม "ชื่อ" และ "ค่า"

รหัสจะถูกสร้างขึ้นโดยอัตโนมัติ

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

เพื่อให้ได้คุณค่า

Properties.Settings.Default.Name

หรือ

Properties.Settings.Default [ "ชื่อ"]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.