.NETのapp.configまたはweb.configから設定を読み取る


807

web.configまたはapp.configファイルから設定を読み取ることができる必要のあるC#クラスライブラリに取り組んでいます(DLLがASP.NET WebアプリケーションまたはWindowsフォームアプリケーションのどちらから参照されているかによって異なります)。

見つけた

ConfigurationSettings.AppSettings.Get("MySetting")

動作しますが、そのコードはマイクロソフトによって非推奨としてマークされています。

私は私が使用すべきであると読んだ:

ConfigurationManager.AppSettings["MySetting"]

ただし、System.Configuration.ConfigurationManagerクラスはC#クラスライブラリプロジェクトから利用できないようです。

これを行う最良の方法は何ですか?


48
私が4つのMSDNの例と記事を読んだように、そしてここに上陸しました。参照を追加するだけです。なぜ彼らはそれを言うことができないのですか。良い質問!+1
Piotr Kula 2012

1
設定書き戻したい場合は、こちらをご覧ください。
マット

回答:


798

あなたはする必要があります参照を追加するSystem.Configurationプロジェクトの中で参照するフォルダ

あなたは間違いなくConfigurationManager時代遅れのものを使用する必要がありますConfigurationSettings


どうもありがとうございました!非常に簡単な答え。私はコンソールアプリを作成していました。そしてこの答えは一日を救います!
PatsonLeaner

1
これはまだ.netコアに対して正確ですか?
Triynko

868

以下のようなサンプルの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 14

これでうまくいきました。ただし、私のSystem.ConfigurationにはConfigurationManagerが含まれていないため、ConfigurationSettingsを使用する必要がありました。皮肉なことに、私はそれが時代遅れであるという警告をまだ受け取りました。
ナイトメアゲーム

13
これも私に起こりました。System.Configurationリファレンスを追加してみましたか?問題は、VSが実際にそれを持っていると思わせることによって、あなたをだますことです。intellisenseを使用して名前空間System.Configurationを取得できますが、ConfigurationManagerクラスがありません。参照を追加するだけで修正されます。
Francine DeGrood Taylor 2015

3
@Cricketheads System.ConfigurationにはConfigurationManagerが含まれているため、プロジェクトでSystem.Configurationへの参照が欠落している可能性があります。
TreK 2015年

2
System.Configurationがデフォルトで追加されていないと思う理由を誰かに教えてもらえますか?これは、ほとんどのアプリケーションでかなり基本的なニーズのようです。
トッドヴァンス

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.クリスコンプトン

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 2017

29

私はこれを使用しています、そしてそれは私にとってうまくいきます:

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

48
TSは、彼が同じコードを使用していることを明示的に述べていますが、彼のプロジェクトはコンパイルに失敗しています(結局のところ、参照が欠落しているため)。質問を読まない場合は-1。
イサンティポフ2013年

23

構成から読み取る:

構成への参照を追加する必要があります。

  1. プロジェクトの「プロパティ」を開きます
  2. 「設定」タブに移動します
  3. 「名前」と「値」を追加します
  4. 次のコードを使用して値を取得します。

    string value = Properties.Settings.Default.keyname;

構成に保存します。

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

1
参考までに:グーグルはあなたの答えが一番好きです。「get app config settings c#」を検索すると、逐語的に表示されます
Steve Gomez


18

App.configファイルをDLLファイルに追加している可能性があります。すべてのDLLファイルは、実行されているEXEファイルの構成ファイルから構成を取得するため、App.Configは実行可能プロジェクトでのみ機能します。

ソリューションに2つのプロジェクトがあるとします。

  • SomeDll
  • SomeExe

問題は、SomeExeではなく、SomeDLLにapp.configファイルを含めていることに関連している可能性があります。SomeDllは、SomeExeプロジェクトから構成を読み取ることができます。


うわー、それは明らかではありません。これについて話しているドキュメントを誰かがリンクできれば、それは素晴らしいことです。これは検索するのが難しいトピックです。
David Krider 2015年

これをありがとう。これはどこにも述べられていませんでした。
パラメータ

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.AppSettingsについてThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M

2
このメソッドは廃止されました
GabrielBB 2014

7

web.configWebアプリケーションで使用されます。web.configデフォルトでは、Webアプリケーションに必要ないくつかの構成があります。あなたは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 2017

4

この呼び出しのラッパーを作成することを強くお勧めします。のようなもので、依存性注入ConfigurationReaderService使用してこのクラスを取得します。これにより、テスト用にこの構成ファイルを分離できます。

したがって、ConfigurationManager.AppSettings["something"];推奨値を使用してこの値を返します。このメソッドを使用すると、.configファイルに使用可能なキーがない場合に、何らかのデフォルトの戻り値を作成できます。


3
Microsoftはすでにエージェントbulitインウェイ同じ設定ファイルの複数のバージョンを管理するために持っている:ビルド構成各ビルド構成のために別々の設定ファイルを持つことができ、: 、app.DEBUG.configapp.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
なぜこれをしたいのですか?
lukejkw 2016

3

完全を期すために、Webプロジェクトでのみ使用できる別のオプションがあります:System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

これの利点は、追加の参照を追加する必要がないので、一部の人にとっては好ましいかもしれません。


3

ステップ1:参照を追加するには、参照タブを右クリックします。

手順2:[アセンブリ]タブをクリックします

ステップ3:「System.Configuration」を検索します

ステップ4:[OK]をクリックします。

その後、動作します。

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

2

私は常に、すべての構成値に対して宣言されたタイプセーフプロパティを備えたIConfigインターフェイスを作成します。次に、Config実装クラスがSystem.Configurationの呼び出しをラップします。すべてのSystem.Configuration呼び出しが1か所に配置され、使用されているフィールドを維持および追跡し、それらのデフォルト値を宣言することが非常に簡単でわかりやすくなりました。一般的なデータ型を読み取って解析するためのプライベートヘルパーメソッドのセットを作成します。

を使用して 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 ManagerをSystem.Configuration.ConfigurationManager介してMicrosoftによるロードが必要になる場合があります

ツール-> NuGetパッケージマネージャー->ソリューションのNuGetパッケージの管理...

Microsoftドキュメント

ドキュメントから注目に値する1つのこと...

アプリケーションが独自の構成への読み取り専用アクセスを必要とする場合は、GetSection(String)メソッドを使用することをお勧めします。このメソッドは、現在のアプリケーションのキャッシュされた構成値へのアクセスを提供します。これは、Configurationクラスよりもパフォーマンスが優れています。


0

作業中の.NETバージョンを確認してください。4より大きい必要があります。また、System.Configurationシステムライブラリをアプリケーションに追加する必要があります。


3
この質問は9年以上前に行われたもので、すでに20を超える回答があり、そのうち2つには600を超える賛成票があり、受け入れられた回答はSystem.Configurationへの参照を追加することです。この追加の答えは価値を追加しません。せいぜい、これは受け入れられた回答に対するコメントであるべきです。
Richardissimo 2018

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