web-dev-qa-db-ja.com

.Net Coreでapp.configを使用する

問題があります。次のようにapp.configを使用する.Net Core(C#)でプログラムを作成する必要があります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="custom" type="ConfigurationSample.CustomConfigurationSection, ConfigurationSample"/>
  </configSections>
  <connectionStrings>
    <add name="sampleDatabase" connectionString="Data Source=localhost\SQLExpress;Initial Catalog=SampleDatabase;Integrated Security=True"/>
  </connectionStrings>
  <appSettings>
    <add key="sampleApplication" value="Configuration Sample"/>
  </appSettings>
  <custom>
    <customConfigurations>
      <add key="customSample" name="Mickey Mouse" age="83"/>
    </customConfigurations>
  </custom>
</configuration>

そして私は書きます:

string connectionString = ConfigurationManager.ConnectionStrings["sampleDatabase"].ConnectionString;
Console.WriteLine(connectionString);

// read appSettings configuration
string appSettingValue = ConfigurationManager.AppSettings["sampleApplication"];
Console.WriteLine(appSettingValue);

そして、それはインターネットからの例ですので、私はうまくいくと思いましたが、例外が発生しています:

System.Configuration.ConfigurationErrorsException: 'Error Initializing the configuration system.'
Inner Exception
TypeLoadException: Could not load type 'System.Configuration.InternalConfigurationHost' from Assembly 'CoreCompat.System.Configuration, Version=4.2.3.0, Culture=neutral, PublicKeyToken=null' because the method 'get_bundled_machine_config' has no implementation (no RVA).

NuGet-Install-Package CoreCompat.System.Configuration -Version 4.2.3-r4 -Preを使用してダウンロードしたが、まだ動作しません。たぶん誰かが私を助けることができますか?

38
Nju
  1. ASP.NET Coreアプリだけでなく、 Configuration API withany.NET Coreアプリを使用できます。コンソールアプリで設定を読み取る方法を示すリンクで提供されているサンプルを見てください。

  2. ほとんどの場合、JSONソース(.jsonファイルとして読み取られる)が最適な構成ソースです。

    注:構成ファイルはappsettings.jsonである必要があると誰かが言っても混乱しないでください。自分に適した任意のファイル名を使用でき、ファイルの場所は異なる場合があります-特定のルールはありません。

    しかし、現実の世界は複雑なので、多くの異なる構成プロバイダーがあります。

    • ファイル形式(INI、JSON、およびXML)
    • コマンドライン引数
    • 環境変数

    等々。カスタムプロバイダーを使用/作成することもできます。

  3. 実際、app.config構成ファイルはXMLファイルでした。したがって、XML構成プロバイダー( githubのソースnugetリンク )を使用して、そこから設定を読み取ることができます。ただし、構成ソースとしてのみ使用されることに注意してください-アプリの動作をロジックで実装する必要があります。構成プロバイダーは、アプリの「設定」やポリシーを変更せず、ファイルからデータを読み取ります。

22
Set

Linuxの.NET Core 2.0でも、通常のSystem.Configurationを使用できます。このテスト例を試してください:

  1. .NET Standard 2.0 Libraryを作成しました(たとえばMyLib.dll
  2. NuGetパッケージSystem.Configuration.ConfigurationManager v4.4.0を追加しました。このパッケージはメタパッケージNetStandard.Library v2.0.0でカバーされていないため、これが必要です(変更されることを望みます)
  3. ConfigurationSectionまたはConfigurationElementから派生したすべてのC#クラスは、MyLib.dllに入ります。たとえば、MyClass.csConfigurationSectionから派生し、MyAccount.csConfigurationElementから派生します。実装の詳細はここでは範囲外ですが、 Googleはあなたの友達です
  4. .NET Core 2.0アプリ(コンソールアプリ、MyApp.dllなど)を作成します。 .NET Coreアプリは、Frameworkで.dllではなく.exeで終わります。
  5. カスタム構成セクションでMyAppapp.configを作成します。これは明らかに上記の#3のクラス設計と一致するはずです。例えば:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="myCustomConfig" type="MyNamespace.MyClass, MyLib" />
  </configSections>
  <myCustomConfig>
    <myAccount id="007" />
  </myCustomConfig>
</configuration>

それだけです-app.configがMyApp内で適切に解析され、MyLib内の既存のコードが正常に機能することがわかります。プラットフォームをWindows(dev)からLinux(test)に切り替える場合は、dotnet restoreを実行することを忘れないでください。

32
DeepSpace101