Чтение из App.config в проекте библиотеки классов - PullRequest
15 голосов
/ 26 марта 2012

Я занимаюсь разработкой простого проекта библиотеки классов , который даст мне 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

Я сделал это для веб-приложения аналогичным образом, и это сработало.Но почему-то я не могу заставить это работать.

Правильно ли изначально иметь App.config в проекте библиотеки классов?

Ответы [ 6 ]

18 голосов
/ 26 марта 2012

Как указано в моем комментарии, добавьте файл App.Config в основное решение, а не в проект библиотеки классов.

6 голосов
/ 27 сентября 2012

Вам не нужно добавлять файл app.config.Если вы создаете библиотеку классов для веб-приложения, вы можете получить строку подключения непосредственно из файла web.config

ИЛИ

. Вы можете добавить любой текстовый файл со строкой подключения и извлечь эту строку.используя это

public static ConnectionStringSettings ConnSettings
{
    get
    {
        string connectionStringKey = null;
        connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
        return ConfigurationManager.ConnectionStrings[connectionStringKey];          
    }
}
1 голос
/ 18 февраля 2019

Доступ к 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 и установите ее, когда она равна нулю, в противном случае верните ее.

1 голос
/ 29 марта 2018

Мой код для чтения файла конфигурации

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>

Если в вашем решении есть несколько проектов в списке, убедитесь, что настройки приложения находятся встартовый проект, иначе вы получите нулевой ответ.

1 голос
/ 23 марта 2017

предполагая, что вопрос касается файла конфигурации, специфичного для проекта dll, а не файла конфигурации приложения или проекта веб-приложения, я использовал следующий код для получения значений из ключей в разделе «sqlSection». (одно предостережение заключается в том, что этот файл конфигурации - даже если он настроен на постоянное копирование - не копируется автоматически при частичной сборке веб-приложения. Поэтому я использовал удивительное однострочное действие предварительной сборки для копирования файла, так как упоминается в этом посте 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();
        }
0 голосов
/ 29 мая 2019

решаемые

Я столкнулся с этой проблемой. То, что я сделал, ниже.

Read from App.config in a Class Library project

Вот как выглядит код

  1. App.config

enter image description here

  1. Из библиотеки классов

    enter image description here

...