web-dev-qa-db-ja.com

クラスライブラリプロジェクトのApp.configから読み取る

単純なクラスライブラリプロジェクトを開発しています。これにより、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"];

しかし、文字列変数に値がありません。

enter image description here

私は同様の方法でWebアプリケーションに対してこれを行い、それはうまくいきました。しかし、どういうわけか私はこれを機能させることができません。

そもそも、クラスライブラリプロジェクトのApp.configを使用するという考えは正しいですか。

17
Yasser Shaikh

私のコメントで述べたように、クラスライブラリプロジェクトではなく、App.Configファイルをメインソリューションに追加します。

19
Darren

App.configファイルを追加する必要はありません。 Webベースのアプリケーションのクラスライブラリを作成すると、web.configファイルから接続文字列を直接フェッチできます

OR

接続文字列を含むテキストファイルを追加して、その文字列をフェッチできます。これを使って

public static ConnectionStringSettings ConnSettings
{
    get
    {
        string connectionStringKey = null;
        connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
        return ConfigurationManager.ConnectionStrings[connectionStringKey];          
    }
}
7
Vijay Channe

質問が、アプリまたは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();
        }
2
civilator

構成ファイルを読み取るための私のコード

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になります。

2
The champ

クラスライブラリプロジェクトの実行可能ファイルから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のときに設定します。それ以外の場合は返します。

1
DrCrazyApe

解決済み

この問題に遭遇しました。私がしたことは以下です。

Read from App.config in a Class Library project

これはコードの外観です

  1. App.config

enter image description here

  1. クラスライブラリから

    enter image description here

0
jithin john