私はweb.config
またはapp.config
ファイルから設定を読み取ることができる必要があるC#クラスライブラリに取り組んでいます(DLLがASP.NET Webアプリケーションから参照されるかWindowsフォームアプリケーションから参照されるかによって異なります)。 。
私はそれを見つけました
ConfigurationSettings.AppSettings.Get("MySetting")
動作しますが、そのコードはMicrosoftによって非推奨としてマークされています。
私は私が使うべきであることを読みました:
ConfigurationManager.AppSettings["MySetting"]
しかし、System.Configuration.ConfigurationManager
クラスはC#クラスライブラリプロジェクトからは利用できないようです。
誰もがこれを行うための最良の方法が何であるかを知っていますか?
プロジェクトのreferencesフォルダ内のSystem.Configuration
に参照を追加をする必要があります。
あなたは間違いなく時代遅れのConfigurationManager
の上でConfigurationSettings
を使うべきです。
以下のようなサンプル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"];
お役に立てれば!
フレームワーク4.5および4.6用に更新。以下は動作しなくなります。
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];
今すぐプロパティを介してSettingクラスにアクセスします。
string keyvalue= Properties.Settings.Default.keyname;
詳細については、 アプリケーション設定の管理 を参照してください。
クラスライブラリを右クリックして、メニューから[参照の追加]オプションを選択します。そして最後に.NETタブからSystem.Configurationを選択します。これはあなたのプロジェクトにSystem.Configuration dllを含めるでしょう。
私はこれを使っています、そしてそれは私のためにうまくいきます
textBox1.Text = ConfigurationManager.AppSettings["Name"];
プロジェクトにSystem.Configurationアセンブリへの参照を追加する必要があります。
設定から読み取る:
Configへの参照を追加する必要があります。
次のコードを使用して値を取得します。
文字列値= Properties.Settings.Default.keyname;
設定に保存:
Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
App.configファイルをDLLに追加している可能性があります。すべてのdllが実行されているexeファイルの設定ファイルから設定を取得するため、App.Configは実行可能プロジェクトに対してのみ機能します。
ソリューションに2つのプロジェクトがあるとしましょう。
あなたの問題は、SomeExeではなくSomeDLLにapp.configを含めているという事実に関連しているかもしれません。 SomeDllはSomeExeプロジェクトから構成を読み取ることができます。
これを試して:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];
Web.configで次の構造にする必要があります。
<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
私は同じ問題を抱えていた、ちょうどこのようにそれらを読む:
System.Configuration.ConfigurationSettings.AppSettings["MySetting"]
web.config
はWebアプリケーションで使用されます。web.config
はデフォルトでWebアプリケーションに必要ないくつかの設定を持ちます。 Webアプリケーションの各フォルダにweb.config
を付けることができます。
app.config
はWindowsアプリケーションに使用されます。 vs.netでアプリケーションをビルドすると、自動的に<appname>.exe.config
に名前が変更されます。このファイルはアプリケーションと一緒に配布する必要があります。
両方の設定ファイルから同じメソッドを使ってapp settings
値を呼び出すことができます。
System.Configuration.ConfigurationSettings.AppSettings["Key"]
また、 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>();
この呼び出し用のWrapperを作成することを強くお勧めします。 ConfigurationReaderService
のようなもので、このクラスを取得するには依存性注入を使います。このようにして、テスト目的でこの構成ファイルを分離することができます。
そのため、推奨されるConfigurationManager.AppSettings["something"];
を使用してこの値を返します。 .configファイルに使用可能なキーがない場合は、この方法で何らかのデフォルトの戻り値を作成できます。
私は以下のように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
}
完全を期すために、Webプロジェクトだけに利用できる別のオプションがあります。
System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]
これの利点は、追加の参照を追加する必要がないため、一部の人にとっては望ましい場合があることです。
ステップ1:レファレンスを追加するためにレファレンスタブを右クリックしてください。
ステップ2:アセンブリタブをクリックしてください
ステップ3:「System.Configuration」を検索して下さい
ステップ4:[OK]をクリックします。
それはうまくいくでしょう
string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
私は今、数日間、この同じ問題に対する修正を見つけようとしています。 web.configのappsettingsタグ内にキーを追加することでこれを解決できました。これは、ヘルパーを使用するときに.dllをオーバーライドするはずです。
<configuration>
<appSettings>
<add key="loginUrl" value="~/RedirectValue.cshtml" />
<add key="autoFormsAuthentication" value="false"/>
</appSettings>
</configuration>
ConfigurationManagerは、独自の設定にアクセスするために必要なものではありません
これを行うには、使用する必要があります
{YourAppName}.Properties.Settings.{settingName}
Plsはあなたが働いている.netバージョンをチェックします。それは4より高くなければなりませんそしてあなたはあなたのアプリケーションにSystem.Configurationシステムライブラリを追加しなければなりません
別の可能な解決策:
var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
私はすべての設定値に対して型保証されたプロパティを宣言したIConfigインターフェイスを常に作成します。 Config実装クラスはSystem.Configurationへの呼び出しをラッパーします。すべてのSystem.Configuration呼び出しは、使用されているフィールドを保守および追跡し、それらのデフォルト値を宣言するために、はるかに簡単かつクリーンになりました。私は一般的なデータ型を読み、解析するためのプライベートヘルパーメソッドのセットを書きます。
IoCフレームワークを使用すると、インターフェースをクラスコンストラクターに渡すだけで、アプリ内の任意の場所にあるIConfigフィールドにアクセスできます。また、単体テストでIConfigインターフェイスのモック実装を作成できるので、App.configファイルまたはWeb.configファイルに触れる必要なく、さまざまな構成値と値の組み合わせをテストできます。
私は、.netcoreプロジェクトで働く以下のアプローチを取ることができました:
手順:
i)プロジェクトにappsettings.json(以下に示す形式)を作成しますii)次に、以下に示す形式の構成クラスを作成します。 iii)構成クラスの使用法を示すLogin()メソッドを作成しました。
Create appsettings.json in your project with content :
`
{
"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);
}
`
私の場合はうまくいきました。
System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]
上記のコード行も古いバージョンであり、新しいライブラリでは推奨されないことに注意する必要があります。