.NET의 app.config 또는 web.config에서 설정 읽기


806

DLL이 ASP.NET 웹 응용 프로그램에서 참조되는지 Windows Forms 응용 프로그램에서 참조되는지에 따라 web.config또는 app.config파일 에서 설정을 읽을 수 있어야하는 C # 클래스 라이브러리에서 작업하고 있습니다 .

나는 그것을 발견했다

ConfigurationSettings.AppSettings.Get("MySetting")

작동하지만 해당 코드는 Microsoft에서 더 이상 사용되지 않는 것으로 표시되었습니다.

내가 사용해야한다고 읽었습니다.

ConfigurationManager.AppSettings["MySetting"]

그러나 System.Configuration.ConfigurationManager클래스는 C # 클래스 라이브러리 프로젝트에서 사용할 수없는 것 같습니다.

가장 좋은 방법은 무엇입니까?


48
내가 4 개의 MSDN 예제와 기사를 읽은 것처럼. 그냥 참조를 추가하십시오. 왜 그렇게 말할 수 없습니까? 좋은 질문! +1
Piotr Kula

1
당신이 할 경우 다시 설정을 쓰기 뿐만 아니라, 봐 여기 당신이 그것을 할 수있는 방법.
Matt

답변:


797

프로젝트의 reference 폴더 에 에 참조추가 해야 합니다 . System.Configuration

당신은 확실히 ConfigurationManager쓸모없는 이상을 사용해야합니다 ConfigurationSettings.


대단히 감사합니다! 매우 정답입니다. 콘솔 앱을 만들고있었습니다! 그리고이 답변은 하루를 저장합니다!
PatsonLeaner

1
이것은 여전히 ​​.net 코어에 정확합니까?
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가 실제로 가지고 있다고 생각하게함으로써 당신을 속이는 것입니다. intellisense를 사용하여 네임 스페이스 System.Configuration을 가져올 수 있지만 ConfigurationManager 클래스는 없습니다. 참조를 추가하면 수정됩니다.
Francine DeGrood Taylor

3
@Cricketheads System.Configuration에 ConfigurationManager가 포함되어 있으므로 프로젝트에서 System.Configuration에 대한 참조가 누락되었을 수 있습니다.
TreK

2
누군가 System.Configuration이 기본적으로 추가되지 않는다고 생각하는 이유를 말해 줄 수 있습니까? 이것은 대부분의 응용 프로그램에서 매우 기본적인 요구 사항처럼 보입니다.
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을 반환 한 이유를 알 수 없었습니다.
J. Chris Compton

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. 프로젝트에서 "속성"을여십시오
  2. "설정"탭으로 이동
  3. "이름"과 "값"추가
  4. 다음 코드를 사용하여 가치를 얻으십시오.

    string value = Properties.Settings.Default.keyname;

구성에 저장하십시오.

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

1
참고 : Google은 귀하의 답변을 가장 좋아합니다. "앱 구성 설정 가져 오기 c #"을 검색 할 때 그대로 표시
Steve Gomez


18

App.config 파일을 DLL 파일에 추가했을 수 있습니다. 모든 DLL 파일은 실행중인 EXE 파일의 구성 파일에서 구성을 가져 오기 때문에 App.Config는 실행 가능한 프로젝트에서만 작동합니다.

솔루션에 두 개의 프로젝트가 있다고 가정 해 봅시다.

  • SomeDll
  • SomeExe

문제는 app.config 파일을 SomeExe가 아닌 SomeDLL에 포함하고 있다는 사실과 관련이있을 수 있습니다. 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
ConfigurationSettings.AppSettings에 관한 Microsoft에 따라This 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.configWindows 응용 프로그램에 사용됩니다. Visual Studio에서 응용 프로그램을 빌드하면 자동으로 이름 <appname>.exe.config이 바뀌고이 파일은 응용 프로그램과 함께 제공되어야합니다.

동일한 방법을 사용하여 app settings두 구성 파일 모두 에서 값 을 호출 할 수 있습니다 . System.Configuration.ConfigurationSettings.AppSettings [ "Key"]


System.Configuration.COnfigurationSettings.AppSettings.Get("Key")대괄호 대신에 사용할 수도 있습니다 .
메이슨

7

아래처럼 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 포인트가 더 이상 사용되지 않는 것으로 표시된 방법을 사용합니다.
user2864740

4

이 호출에 대한 랩퍼 를 작성하는 것이 좋습니다 . 이 클래스를 얻으려면 a ConfigurationReaderService의존성 주입 을 사용하십시오 . 이런 식으로 테스트 목적으로이 구성 파일을 분리 할 수 ​​있습니다.

ConfigurationManager.AppSettings["something"];제안 된 값을 사용 하여이 값을 반환하십시오. 이 방법을 사용하면 .config 파일에 사용 가능한 키가없는 경우 일종의 기본 반환을 만들 수 있습니다.


3
: 마이크로 소프트는 이미 bulit-의 방식으로 여러 개의 동일한 설정 파일의 버전을 관리 할 수있다 빌드 구성 : 각 빌드 구성에 대해 별도의 설정 파일을 가지고 허용 app.DEBUG.config, app.RELEASE.configapp.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
왜 지구상에서 이것을하고 싶습니까?
lukejkw

3

완전성을 위해 웹 프로젝트에만 사용할 수있는 다른 옵션이 있습니다. System.Web.Configuration.WebConfigurationManager.AppSettings [ "MySetting"]

이것의 이점은 추가 참조를 추가 할 필요가 없으므로 일부 사람들에게 바람직 할 수 있다는 것입니다.


3

1 단계 : 참조 탭을 마우스 오른쪽 버튼으로 클릭하여 참조를 추가하십시오.

2 단계 : 어셈블리 탭 클릭

3 단계 : 'System.Configuration'검색

4 단계 : 확인을 클릭하십시오.

그런 다음 작동합니다.

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

2

항상 모든 구성 값에 대해 선언 된 typesafe 속성을 사용하여 IConfig 인터페이스를 만듭니다. 그런 다음 구성 구현 클래스는 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

나는 며칠 동안이 같은 문제에 대한 해결책을 찾으려고 노력했습니다. web.config 파일 의 appsettings 태그 내에 키를 추가하여이 문제를 해결할 수있었습니다 . 도우미를 사용할 때 .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. 구성 클래스의 사용법을 보여주기 위해 Login () 메소드를 작성했습니다.

    컨텐츠로 프로젝트에서 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수업 을 이용하고 싶거나 원한다면 ...

NuGet Package ManagerSystem.Configuration.ConfigurationManager 를 통해 Microsoft 에서로드해야 할 수도 있습니다.

도구-> NuGet 패키지 관리자-> 솔루션 용 NuGet 패키지 관리 ...

Microsoft 문서

문서에서 주목할 가치가있는 것은 ...

응용 프로그램에서 자체 구성에 대한 읽기 전용 액세스 권한이 필요한 경우 GetSection (String) 메서드를 사용하는 것이 좋습니다. 이 메소드는 현재 애플리케이션의 캐시 된 구성 값에 대한 액세스를 제공하며 이는 Configuration 클래스보다 성능이 우수합니다.


0

작업중인 .NET 버전을 확인하십시오. 4보다 커야합니다. 그리고 응용 프로그램에 System.Configuration 시스템 라이브러리를 추가해야합니다.


3
이 질문은 9 년 전에 요청되었으며, 각각 600 개 이상의 투표를 가진 2 개를 포함하여 20 개가 넘는 답변이 있으며 허용되는 답변은 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.