.NET Core 2.0でConfigurationManager.AppSettingsを使用できますか?


142

私はこのように私の設定ファイルから設定を読み取るメソッドを持っています:

var value = ConfigurationManager.AppSettings[key];

.NET Standard 2.0のみを対象とする場合、問題なくコンパイルされます。

これで複数のターゲットが必要になるので、プロジェクトファイルを次のように更新しました。

<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>

しかし今、コンパイルnetcoreapp2.0は次のエラーメッセージで失敗します:

Error   CS0103  The name 'ConfigurationManager' does not exist in the current context   (netcoreapp2.0)

別に、新しい.NET Core 2.0コンソールアプリケーション(今回は.NET Core 2.0のみを対象としています)を作成しましたが、同様にConfigurationManager名前空間の下には何もないようSystem.Configurationです。

.NET Standard 2.0で利用できるので混乱しています。.NETCore 2.0は.NET Standard 2.0に準拠しているため、.NET Core 2.0でも利用できると思います。

何が欠けていますか?


10
あなたはおそらくこれを見逃しいるでしょう。(.NET標準ターゲットは.NETと.NET Coreの両方をカバーするため、実際にそれらを個別にビルドする必要はありません。)
Jeroen Mostert

@JeroenMostertに感謝します。NuGetパッケージSystem.Configuration.ConfigurationManagerを追加すると問題が解決しました。さて、これはおそらく別の質問ですが、不足しているビットをポリフィルするためにパッケージを追加する必要がある場合、.NET Core 2.0はどのように.NET Standard 2.0に準拠していると見なされますか?
AlexSanséau2017

2
「.NET Standard 2.0準拠」とは、「これをビルドして.NET Standard 2.0をターゲットにする場合、(他のプラットフォームの中でも).NET Core 2.0で実行される」ことを意味します。「これをビルドして.NET Core 2.0をターゲットにする場合、すべての.NET Standard 2.0 APIはそれ以上のアクションなしで利用可能になる」という意味ではありません。あなたは.NET標準2.0にこれを構築し、それは.NETのコア上で実行しない場合、その後、あなたは苦情の原因がありますが、私はこれがちょうど仕事に行っていると思います。(ただし、テストはしていません。)
Jeroen Mostert、2017

4
@AlexSanséauNuGetパッケージはポリフィルではありません。.NET Coreの作業を開始したとき、MicrosoftはAPIをオプトインにすることを決定しました。つまり、アプリケーションのフットプリントが小さくなります。少し時間をかけて、Immo Landwerthが.NET Standard(youtube.com/…)で作成したビデオを視聴することをお勧めします。彼は.NET StandardチームのPMです
Jamie Taylor

1
RE:It compiles fine when targeting .NET Standard 2.0 only- ConfigurationManagerは.NET Standardの一部ではないため、これは正しくありません(これまでのところ、v.2.1までは当てはまります)。
G.ストイネフ

回答:


268

はいConfigurationManager.AppSettings。NuGetパッケージを参照すると、.NET Core 2.0で利用できますSystem.Configuration.ConfigurationManager

クレジットは、解決策を提供してくれた@JeroenMostertに送られます。


1
設定ファイルからコードを投稿できますか?私は.NET Core 2.0でグローバル変数を設定する方法/場所を理解しようとしています
egmfrs 2018

1
@egmfrs、言い換えてください。グローバル変数は、クラスの静的プロパティの形で存在します。設定ファイルは、アプリケーションの設定が含まれていることは、それらの通常の形式である:<add key="YourSetting" value="YourValue" />
アレックスSanséau

2
@AlexSanséau、AppSettingsの値をどこに設定できるかを考えています。web.configまたはappsettings.jsonが機能しません。AppSettingsを設定する場所の例を挙げていただけますか?ありがとう。
Jan Deutschl

2
@JanDeutschlの場合、従来の.NETプロジェクトの場合と同様に、web.configまたはapp.configのappSettingsセクションに移動する必要があります。
AlexSanséau2018年

8
私は少し混乱しています。これは.NET Framework 4.6依存関係としてリストされます。それは私の `.NET Core`プロジェクトが純粋なCoreプロジェクトではなくなったことを意味しますか?
James Poulose

20

System.Configuration.ConfigurationManagerNugetから.net core 2.2アプリケーションにインストールしました。

次に参照します using System.Configuration;

次に、変えました

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

これまでのところ、私はこれが正しいと信じています。 4.5.0 is typical with .net core 2.2

私はこれで何の問題もありませんでした。


移行のための簡単な修正の1つ。その他のいくつかはそれほど楽しくありません:/
トムスティッケル

web.configファイルも作成しましたか?
swedish_junior_dev

2
私(.net core 3.1)では機能しません。アクセスした場合、設定データはありません
arteny

@Arteny-3.1でテストしなかった-3.1をインストールして自宅で遊んだ-しかし、現在のクライアントはすぐにアップグレードしたくありません。
トムスティッケル

9

パッケージをセットアップしたら、app.configまたはweb.configを作成し、次のようなものを追加する必要があります。

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

7

最新のガイダンスセットは次のとおりです(https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variablesから)

使用する:

System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);

ドキュメントから:

public static class EnvironmentVariablesExample
{
    [FunctionName("GetEnvironmentVariables")]
    public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
        log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
    }

    public static string GetEnvironmentVariable(string name)
    {
        return name + ": " +
            System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
    }
}

ローカルで開発するときとAzureで実行するときの両方で、アプリの設定を環境変数から読み取ることができます。ローカルで開発する場合、アプリの設定Valueslocal.settings.jsonファイルのコレクションから取得されます。ローカルとAzureの両方の環境GetEnvironmentVariable("<app setting name>")で、名前付きアプリ設定の値を取得します。たとえば、ローカルで実行している場合、local.settings.jsonファイルにが含まれていると「My Site Name」が返されます{ "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }

System.Configuration.ConfigurationManager.AppSettingsのプロパティには、アプリの設定値を取得するための代替APIですが、私たちは、あなたが使用することをお勧めしますGetEnvironmentVariableここに示されているよう。


このアウトをしようと、誰のために、あなたはこれを宣言することにより、Microsoftの例に似た構文Get:using static System.Environment;
MattMakes

1

これを解決するには、構成を使用できます。

例(Startup.cs):

この実装後にDIをコントローラーに渡すことができます。

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();

    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        var microserviceName = Configuration["microserviceName"];

       services.AddSingleton(Configuration);

       ...
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.