การอ่านการตั้งค่าจาก app.config หรือ web.config ใน. NET


806

ฉันกำลังทำงานกับไลบรารีคลาส C # ที่ต้องสามารถอ่านการตั้งค่าจากweb.configหรือapp.configไฟล์ (ขึ้นอยู่กับว่า DLL นั้นถูกอ้างอิงจากแอปพลิเคชันเว็บ ASP.NET หรือแอปพลิเคชัน Windows Forms)

ฉันพบว่า

ConfigurationSettings.AppSettings.Get("MySetting")

ใช้งานได้ แต่รหัสนั้นถูกทำเครื่องหมายว่าไม่สนับสนุนโดย Microsoft

ฉันได้อ่านแล้วว่าควรใช้:

ConfigurationManager.AppSettings["MySetting"]

อย่างไรก็ตามSystem.Configuration.ConfigurationManagerดูเหมือนว่าคลาสจะไม่พร้อมใช้งานจากโครงการ C # Class Library

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?


48
เช่นฉันอ่าน 4 ตัวอย่าง MSDN และบทความ .. และลงที่นี่ เพียงแค่เพิ่มการอ้างอิง .. ทำไมพวกเขาไม่สามารถพูดได้ คำถามที่ดี! +1
Piotr Kula

1
หากคุณต้องการเขียนการตั้งค่ากลับมาให้ดูที่นี่ว่าคุณจะทำได้อย่างไร
Matt

คำตอบ:


797

คุณจะต้องเพิ่มการอ้างอิงไปSystem.Configurationในโครงการของคุณโฟลเดอร์อ้างอิง

คุณควรใช้สิ่งConfigurationManagerที่ล้าสมัยConfigurationSettingsอย่างแน่นอน


ขอบคุณมาก! คำตอบที่ตรงไปตรงมามาก ฉันกำลังสร้างแอปคอนโซล! และคำตอบนี้ช่วยได้ทั้งวัน!
PatsonLeaner

1
นี่ยังคงแม่นยำสำหรับ. net core
Triynko

867

สำหรับตัวอย่างไฟล์ app.config ด้านล่าง:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

คุณอ่านการตั้งค่าแอปพลิเคชันด้านบนโดยใช้รหัสที่แสดงด้านล่าง

using System.Configuration;

คุณอาจต้องเพิ่มการอ้างอิงSystem.Configurationในโครงการของคุณหากยังไม่มีใครอ้างอิง จากนั้นคุณสามารถเข้าถึงค่าต่างๆดังนี้:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

124
ฉันชอบคำตอบของคุณมากกว่าคำตอบที่ยอมรับ คำตอบพร้อมตัวอย่างทำเคล็ดลับสำหรับฉันเสมอ
Brendan Vogt

สิ่งนี้ใช้ได้สำหรับฉัน อย่างไรก็ตาม System.Configuration ของฉันไม่มี ConfigurationManager ดังนั้นฉันต้องใช้ ConfigurationSettings กระแทกแดกดันฉันยังคงได้รับคำเตือนว่ามันล้าสมัย
เกมฝันร้าย

13
เรื่องนี้เกิดขึ้นกับฉันด้วย คุณได้ลองเพิ่มการอ้างอิง System.Configuration หรือไม่? ปัญหาคือ VS ทำให้คุณโง่โดยทำให้คุณคิดว่าคุณมีอยู่จริง คุณสามารถใช้ระบบภายในเพื่อรับเนมสเปซ System.Configuration แต่ไม่มีคลาส ConfigurationManager เพียงเพิ่มการอ้างอิงและแก้ไขได้
Francine DeGrood Taylor

3
@Cricketheads System.Configuration มี ConfigurationManager คุณอาจพลาดการอ้างอิงไปยัง System.Configuration ในโครงการของคุณ
TreK

2
มีคนบอกฉันได้ไหมว่าทำไมพวกเขาถึงคิดว่าการตั้งค่าระบบจะไม่ถูกเพิ่มโดยค่าเริ่มต้น ... นี่เป็นความต้องการขั้นพื้นฐานในแอปพลิเคชันส่วนใหญ่
Todd Vance

89

การปรับปรุงสำหรับ. NET Framework 4.5 และ 4.6 ต่อไปนี้จะไม่ทำงานอีกต่อไป:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

ตอนนี้เข้าถึงคลาสการตั้งค่าผ่านคุณสมบัติ:

string keyvalue = Properties.Settings.Default.keyname;

ดูการจัดการการตั้งค่าแอปพลิเคชันสำหรับข้อมูลเพิ่มเติม


1
คุณสมบัติตั้งแต่2010
Nick Westgate

1
ขอบคุณมากที่โพสต์ข้อความนี้ ฉันพิจารณาแล้วว่า Properties.Settings.Default.MachName ทำงานได้ แต่ฉันไม่สามารถหาสาเหตุที่ว่าทำไม ConfigurationManager.AppSettings ["MachName"] จึงส่งคืน null
เจ. คริสคอมป์ตัน

1
เรื่องนี้จบลงด้วยความเจ็บปวดที่ยืดเยื้อของฉัน ขอบคุณ กรอบควรเตือนคุณว่าวิธีเก่าล้าสมัย
Neil B

7
ไม่สามารถยืนยันได้ ConfigurationManager.AppSettings ["someKey"] ใช้งานได้ใน. NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe VisualStudio เวอร์ชันใดที่คุณใช้? ConfigurationManager.AppSettings ["someKey"] ทำงานกับ 4.6.1 และ VS 15.8.2 แต่ล้มเหลวด้วย 4.6.1 และ VS 15.9.2 สำหรับฉัน
kkuilla

37

คลิกขวาที่ไลบรารีคลาสของคุณแล้วเลือกตัวเลือก "เพิ่มการอ้างอิง" จากเมนู

และจากแท็บ. NET เลือก System.Configuration ซึ่งรวมถึงไฟล์ System.Configuration DLL ในโครงการของคุณ


หลังจากเพิ่มการอ้างอิงแล้วก็สามารถทำได้ConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

ฉันใช้สิ่งนี้และมันใช้งานได้ดีสำหรับฉัน:

textBox1.Text = ConfigurationManager.AppSettings["Name"];

48
TS ระบุอย่างชัดเจนว่าเขาใช้รหัสเดียวกัน แต่โครงการของเขาล้มเหลวในการรวบรวม (เนื่องจากมีการอ้างอิงที่ขาดหายไปในขณะที่มันเปิดออก) -1 สำหรับการไม่อ่านคำถาม
Isantipov

23

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

คุณจะต้องเพิ่มการอ้างอิงไปยังการกำหนดค่า:

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

    string value = Properties.Settings.Default.keyname;

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

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

1
FYI: Google ชอบคำตอบของคุณดีที่สุด แสดงคำต่อคำเมื่อคุณค้นหา "รับการตั้งค่าการกำหนดค่าแอป c #"
Steve Gomez


18

คุณอาจจะเพิ่มไฟล์ App.config ลงในไฟล์ DLL App.Config ใช้งานได้สำหรับโครงการที่ดำเนินการได้เนื่องจากไฟล์ DLL ทั้งหมดใช้การกำหนดค่าจากไฟล์การกำหนดค่าสำหรับไฟล์ EXE ที่กำลังดำเนินการ

สมมติว่าคุณมีสองโครงการในโซลูชันของคุณ:

  • SomeDll
  • SomeExe

ปัญหาของคุณอาจเกี่ยวข้องกับความจริงที่ว่าคุณรวมไฟล์ app.config ไว้กับ SomeDLL และไม่ใช่ SomeExe SomeDll สามารถอ่านการกำหนดค่าจากโครงการ SomeExe


ว้าวนั่นไม่ชัดเจน หากใครบางคนสามารถเชื่อมโยงเอกสารที่พูดถึงเรื่องนี้ได้ นี่เป็นหัวข้อที่ยากที่จะค้นหา
David Krider

ขอบคุณสำหรับสิ่งนี้. ไม่เห็นสิ่งนี้ระบุไว้ที่ใดก็ได้
พารามิเตอร์

10

ลองสิ่งนี้:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

ในไฟล์web.configควรเป็นโครงสร้างต่อไปนี้:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>

8

ผมมีปัญหาเดียวกัน. เพียงแค่อ่านวิธีนี้: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]


4
ตาม Microsoft เกี่ยวกับ ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M

2
วิธีนี้ล้าสมัย
GabrielBB

7

web.configใช้กับเว็บแอปพลิเคชัน web.configโดยค่าเริ่มต้นมีการกำหนดค่าหลายอย่างที่จำเป็นสำหรับโปรแกรมประยุกต์บนเว็บ คุณสามารถมีweb.configสำหรับแต่ละโฟลเดอร์ภายใต้เว็บแอปพลิเคชันของคุณ

app.configใช้สำหรับแอปพลิเคชัน Windows เมื่อคุณสร้างแอปพลิเคชันใน Visual Studio มันจะถูกเปลี่ยนชื่อโดยอัตโนมัติ<appname>.exe.configและจะต้องส่งไฟล์นี้ไปพร้อมกับแอปพลิเคชันของคุณ

คุณสามารถใช้วิธีเดียวกันนี้ในการเรียกapp settingsค่าจากทั้งไฟล์การกำหนดค่า: System.Configuration.ConfigurationSettings.AppSettings ["Key"]


เป็นไปได้ที่จะใช้System.Configuration.COnfigurationSettings.AppSettings.Get("Key")แทนการใช้วงเล็บเหลี่ยม
Mason

7

ในขณะที่ฉันพบวิธีที่ดีที่สุดในการเข้าถึงตัวแปรการตั้งค่าแอปพลิเคชันอย่างเป็นระบบโดยการทำให้คลาส wrapper ทับ System.Configuration ดังนี้

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

ตอนนี้เราสามารถเข้าถึงตัวแปรการตั้งค่าที่จำเป็นด้วยชื่อฮาร์ดโค้ดโดยใช้คลาสอื่นดังต่อไปนี้:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}

วิธีนี้ใช้วิธีการที่ OP points out ทำเครื่องหมายว่าเลิกใช้แล้ว
2864740

4

ฉันขอแนะนำให้คุณสร้างเสื้อคลุมสำหรับการโทรนี้ บางอย่างเช่น a ConfigurationReaderServiceและใช้การฉีดพึ่งพาเพื่อรับคลาสนี้ วิธีนี้คุณจะสามารถแยกไฟล์การกำหนดค่านี้เพื่อวัตถุประสงค์ในการทดสอบ

ดังนั้นใช้การConfigurationManager.AppSettings["something"];แนะนำและส่งกลับค่านี้ ด้วยวิธีนี้คุณสามารถสร้างการคืนค่าเริ่มต้นบางประเภทได้หากไม่มีคีย์ใด ๆ ในไฟล์. config


3
ไมโครซอฟท์แล้วมีหัวกระสุนในวิธีการจัดการหลายรุ่นของไฟล์ config เดียวกัน: สร้างการกำหนดค่าที่อนุญาตให้มี config ไฟล์แยกต่างหากสำหรับแต่ละกำหนดค่าการสร้าง: app.DEBUG.config, app.RELEASE.configและapp.TEST.configอื่น ๆ
jpaugh

4

นอกจากนี้คุณสามารถใช้Formo :

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

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

รหัส:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();

5
ทำไมบนโลกนี้คุณต้องการทำสิ่งนี้?
ลุคเจค

3

เพียงเพื่อความสมบูรณ์มีตัวเลือกอื่นสำหรับเว็บโครงการเท่านั้น: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

ประโยชน์ของสิ่งนี้คือมันไม่จำเป็นต้องมีการอ้างอิงเพิ่มเติมเพื่อเพิ่มดังนั้นจึงอาจเป็นที่นิยมสำหรับบางคน


3

ขั้นตอนที่ 1: คลิกขวาที่แท็บการอ้างอิงเพื่อเพิ่มการอ้างอิง

ขั้นตอนที่ 2: คลิกที่แท็บชุดประกอบ

ขั้นตอนที่ 3: ค้นหา 'System.Configuration'

ขั้นตอนที่ 4: คลิกตกลง

จากนั้นมันจะทำงาน

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];

2

ฉันมักจะสร้างอินเทอร์เฟซ IConfig พร้อมคุณสมบัติ typesafe ที่ประกาศสำหรับค่าการตั้งค่าทั้งหมด จากนั้นคลาสการปรับใช้ Config จะตัดการเรียกไปที่ System.Configuration การเรียกใช้ System.Configuration ทั้งหมดของคุณอยู่ในที่เดียวและมันง่ายขึ้นและสะอาดยิ่งขึ้นในการดูแลและติดตามว่ามีการใช้ฟิลด์ใดและประกาศค่าเริ่มต้น ฉันเขียนชุดวิธีผู้ช่วยส่วนตัวเพื่ออ่านและแยกประเภทข้อมูลทั่วไป

การใช้เฟรมเวิร์กIoCคุณสามารถเข้าถึงฟิลด์ IConfig ได้ทุกที่ในแอปพลิเคชันของคุณโดยเพียงแค่ส่งอินเตอร์เฟสไปยังตัวสร้างคลาส จากนั้นคุณยังสามารถสร้างการประยุกต์ใช้จำลองของอินเทอร์เฟซ IConfig ในการทดสอบหน่วยของคุณเพื่อให้คุณสามารถทดสอบค่าการกำหนดค่าและชุดค่าต่างๆโดยไม่จำเป็นต้องแตะไฟล์ App.config หรือ Web.config ของคุณ


1

ทางออกที่เป็นไปได้อื่น:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();

1

ฉันพยายามค้นหาวิธีแก้ไขปัญหาเดียวกันนี้มาสองสามวันแล้ว ฉันสามารถแก้ไขปัญหานี้ได้ด้วยการเพิ่มคีย์ภายในแท็ก appsettings ในไฟล์web.config สิ่งนี้ควรแทนที่ไฟล์. dll เมื่อใช้ตัวช่วย

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>

1

คุณสามารถใช้บรรทัดด้านล่าง ในกรณีของฉันมันทำงาน: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

คุณต้องระวังว่าโค้ดข้างต้นเป็นเวอร์ชั่นเก่าและเลิกใช้แล้วในไลบรารีใหม่


1

ConfigurationManager ไม่ใช่สิ่งที่คุณต้องการในการเข้าถึงการตั้งค่าของคุณเอง

เมื่อต้องการทำเช่นนี้คุณควรใช้

{YourAppName}.Properties.Settings.{settingName}


1

ฉันสามารถรับวิธีการทำงานด้านล่างสำหรับโครงการ. NET Core:

ขั้นตอน:

  1. สร้าง appsettings.json (รูปแบบที่ระบุด้านล่าง) ในโครงการของคุณ
  2. ถัดไปสร้างคลาสการกำหนดค่า รูปแบบที่ให้ไว้ด้านล่าง
  3. ฉันได้สร้างวิธีการลงชื่อเข้าใช้ () เพื่อแสดงการใช้งานคลาสการกำหนดค่า

    สร้าง appsettings.json ในโครงการของคุณด้วยเนื้อหา:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }

1

หากคุณต้องการ / ต้องการใช้ConfigurationManagerคลาส ...

คุณอาจต้องโหลดSystem.Configuration.ConfigurationManagerโดย Microsoft ผ่านทางNuGet Package Manager

เครื่องมือ -> ตัวจัดการแพ็คเกจ NuGet-> จัดการแพคเกจ NuGet สำหรับโซลูชัน ...

เอกสาร Microsoft

สิ่งหนึ่งที่น่าสังเกตจากเอกสาร ...

หากแอปพลิเคชันของคุณต้องการเข้าถึงการกำหนดค่าของตัวเองแบบอ่านอย่างเดียวเราขอแนะนำให้คุณใช้เมธอด GetSection (String) วิธีนี้ให้การเข้าถึงค่าการกำหนดค่าที่แคชไว้สำหรับแอปพลิเคชันปัจจุบันซึ่งมีประสิทธิภาพที่ดีกว่าคลาสการกำหนดค่า


0

กรุณาตรวจสอบเวอร์ชั่น. NET ที่คุณใช้งานอยู่ มันควรจะสูงกว่า 4 และคุณต้องเพิ่มไลบรารีระบบ System.Configuration ไปยังแอปพลิเคชันของคุณ


3
คำถามนี้ถูกถามเมื่อ 9 ปีที่แล้วและมีมากกว่า 20 คำตอบซึ่งรวมถึง 2 ข้อที่มี upvotes มากกว่า 600 คำตอบที่ได้รับการยอมรับคือการเพิ่มการอ้างอิงไปยัง System.Configuration คำตอบเพิ่มเติมนี้ไม่ได้เพิ่มคุณค่า ที่ดีที่สุดควรเป็นความเห็นเกี่ยวกับคำตอบที่ได้รับการยอมรับ
Richardissimo

เรื่อง"สูงกว่า 4" : ในหมายเลขรุ่นหลัก? หรือคุณหมายถึง"สูงกว่า 4.0" ? หรือกล่าวอีกนัยหนึ่ง. NET Framework 4.5จะเปิดใช้งานด้านใด
Peter Mortensen

-8

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

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

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