単純なクラスライブラリプロジェクトを開発しています。これにより、dllが提供されます。
特定の値を構成ファイルから読み取って欲しかった。そこで、App.configファイルをプロジェクトに追加しました。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="serviceUrl" value="test value" />
</appSettings>
</configuration>
上記は私のApp.configファイルで、今は次のように読み取ろうとしています
string strVal = System.Configuration.ConfigurationManager.AppSettings["serviceUrl"];
しかし、文字列変数に値がありません。
私は同様の方法でWebアプリケーションに対してこれを行い、それはうまくいきました。しかし、どういうわけか私はこれを機能させることができません。
そもそも、クラスライブラリプロジェクトのApp.configを使用するという考えは正しいですか。
私のコメントで述べたように、クラスライブラリプロジェクトではなく、App.Configファイルをメインソリューションに追加します。
App.configファイルを追加する必要はありません。 Webベースのアプリケーションのクラスライブラリを作成すると、web.configファイルから接続文字列を直接フェッチできます
OR
接続文字列を含むテキストファイルを追加して、その文字列をフェッチできます。これを使って
public static ConnectionStringSettings ConnSettings
{
get
{
string connectionStringKey = null;
connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
return ConfigurationManager.ConnectionStrings[connectionStringKey];
}
}
質問が、アプリまたはWebアプリプロジェクトの構成ファイルではなく、dllプロジェクトに固有の構成ファイルを要求していると想定して、次のコードを使用して、「sqlSection」セクションのキーから値を取得しました。 (1つの注意は、常にコピーするように設定されている場合でも、この構成ファイルはWebアプリの部分ビルドでは自動的にコピーされないため、素晴らしい1行の事前ビルドアクションを使用してファイルをコピーします。この投稿で言及 https://stackoverflow.com/a/40158880/1935056 )。
ここに全体のdll設定ファイルがあります
<?xml version="1.0" encoding="utf-8" ?>
<sqlSection>
<add key="sql1" value="--statement--"/>
</sqlSection>
これはc#コードです。
string GetSqlStatement(string key)
{
string path = Path.GetDirectoryName(Assembly.GetCallingAssembly().CodeBase) + @"\DataLayer.dll.config";
XDocument doc = XDocument.Load(path);
var query = doc.Descendants("sqlSection").Nodes().Cast<XElement>().Where(x => x.Attribute("key").Value.ToString() == key).FirstOrDefault();
if (query != null)
{
return query.Attribute("value").Value.ToString();
}
構成ファイルを読み取るための私のコード
Int32 FilesCountLimit = Convert.ToInt32(ConfigurationManager.AppSettings["FilesTotalCount"]);
long FilesLengthLimit = Convert.ToInt64(ConfigurationManager.AppSettings["FilesTotalSize"]);
私のapp.configファイルの例
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="FilesTotalCount" value="1000" />
<add key="FilesTotalSize" value="500000000" />
</appSettings>
</configuration>
ソリューションに複数のプロジェクトがリストされている場合は、アプリの設定が起動プロジェクトにあることを確認してください。そうでない場合、答えとしてnullになります。
クラスライブラリプロジェクトの実行可能ファイルからApp.Configにアクセスします。
プロジェクト1:サンプル(実行可能プロジェクト.exe)
プロジェクト2:Sample.Database(クラスライブラリプロジェクト.dll)
プロジェクト1にはapp.config:が含まれています
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<connectionStrings>
<clear />
<add name="Connection_Local" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\work\WF\ScaleCalibration\ScaleCalibration\AppData\db_local.mdf;Integrated Security=True;Connect Timeout=30" />
</connectionStrings>>
</configuration>
プロジェクト2は構成設定にアクセスする必要があります...次のクラスを作成します:
public class AssemblyConfiguration : MarshalByRefObject
{
public static string GetConnectionString(string name)
{
Assembly callingAssembly = Assembly.GetEntryAssembly();
var conStringCollection = ConfigurationManager.OpenExeConfiguration(callingAssembly.Location).ConnectionStrings;
return conStringCollection?.ConnectionStrings[name].ConnectionString;
}
}
dllプロジェクトの静的クラス:
public static class DBConnection
{
public static string ConnectionStringLocal => AssemblyConfiguration.GetConnectionString("Connection_Local");
}
クラスライブラリプロジェクトの任意の場所で使用:
var xx = DBConnection.ConnectionStringLocal;
すべての関数呼び出しで接続文字列を読みたくない場合は、DBConnectionでメンバー変数を作成し、それがnullのときに設定します。それ以外の場合は返します。