Я работаю над библиотекой классов С#, которая должна быть в состоянии читать настройки из файла web.config
или app.config
(в зависимости от того, ссылается ли DLL из веб-приложения ASP.NET или приложения Windows Forms).
Я обнаружил, что
ConfigurationSettings.AppSettings.Get("MySetting")
работает, но этот код был отмечен как устаревший Microsoft.
Я читал, что должен использовать:
ConfigurationManager.AppSettings["MySetting"]
Однако класс System.Configuration.ConfigurationManager
, похоже, не доступен из проекта библиотеки классов С#.
Кто-нибудь знает, что лучший способ сделать это?
Ответ 1
Вам нужно добавить ссылку в System.Configuration
в папку ссылок.
Вы должны использовать ConfigurationManager
для устаревшего ConfigurationSettings
.
Ответ 2
Для примера 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"];
Надеюсь это поможет!
Ответ 3
Обновление для фреймворков 4.5 и 4.6; следующее больше не будет работать:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];
Теперь перейдите в класс настроек через Properties:
string keyvalue= Properties.Settings.Default.keyname;
Подробнее см. "Управление настройками приложения" .
Ответ 4
Щелкните правой кнопкой мыши на своей библиотеке классов и выберите "Добавить ссылки" в меню; и, наконец, с вкладки .NET выберите System.Configuration. Это будет включать DLL System.Configuration в ваш проект.
Ответ 5
Я использую это, и он хорошо работает для меня
textBox1.Text = ConfigurationManager.AppSettings["Name"];
Ответ 6
Чтение из конфигурации:
Вам нужно добавить ссылку на Config
Сохранить в настройках:
Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Ответ 7
Вы должны добавить в проект ссылку на сборку System.Configuration.
Ответ 8
Возможно, вы добавляете файл App.config в DLL. App.Config работает только для исполняемых проектов, так как все DLL принимают конфигурацию из файла конфигурации для исполняемого exe.
Скажем, у вас есть два проекта в вашем решении:
Возможно, проблема связана с тем, что вы включили app.config в SomeDLL, а не в SomeExe. SomeDll может прочитать конфигурацию из проекта SomeExe.
Ответ 9
Попробуйте следующее:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];
В web.config должна быть следующая структура:
<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
Ответ 10
У меня была та же проблема, просто прочитайте их следующим образом:
System.Configuration.ConfigurationSettings.AppSettings["MySetting"]
Ответ 11
web.config
используется с веб-приложениями. По умолчанию web.config
имеет несколько конфигураций, необходимых для веб-приложения. Вы можете создать web.config
для каждой папки в вашем веб-приложении.
app.config
используется для приложений Windows. Когда вы создаете приложение в vs.net, оно будет автоматически переименовано в <appname>.exe.config
и этот файл должен быть доставлен вместе с вашим приложением.
Вы можете использовать один и тот же метод для вызова значений app settings
из обоих файлов конфигурации:
System.Configuration.ConfigurationSettings.AppSettings["Key"]
Ответ 12
Как я нашел лучший подход для доступа к переменным параметрам приложения системным образом, создав класс-оболочку над 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
}
Ответ 13
Я настоятельно рекомендую вам создать Wrapper для этого вызова. Что-то вроде ConfigurationReaderService
и используйте инъекцию зависимости, чтобы получить этот класс. Таким образом вы сможете изолировать эти файлы конфигурации для целей тестирования.
Поэтому используйте предложенный ConfigurationManager.AppSettings["something"];
и верните это значение. Вы можете с помощью этого метода создать какой-то возврат по умолчанию, если в файле .config нет ключа.
Ответ 14
Кроме того, вы можете использовать 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>();
Ответ 15
Просто для полноты, есть еще один вариант, доступный только для веб-проектов:
System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]
Преимущество этого заключается в том, что он не требует добавления дополнительной ссылки, поэтому для некоторых людей это может быть предпочтительнее.
Ответ 16
Я всегда создаю интерфейс IConfig со свойствами typeafe, объявленными для всех значений конфигурации. Затем класс реализации Config завершает вызовы System.Configuration. Все ваши вызовы System.Configuration теперь в одном месте намного проще и чище, чтобы поддерживать и отслеживать, какие поля используются, и объявлять их значения по умолчанию. Я пишу набор частных вспомогательных методов для чтения и анализа общих типов данных.
Используя структуру IoC, вы можете получить доступ к полям IConfig в любом месте вашего приложения, просто передав интерфейс конструктору класса. Затем вы можете создавать макетные реализации интерфейса IConfig в своих модульных тестах, чтобы теперь вы могли тестировать различные значения конфигурации и комбинации значений без необходимости касаться файлов App.config или Web.config.
Ответ 17
Шаг 1: Щелкните правой кнопкой мыши на вкладке ссылок, чтобы добавить ссылку.
Шаг 2: Нажмите на вкладку Сборки
Шаг 3: Поиск "System.Configuration"
Шаг 4: Нажмите ОК.
Тогда будет работать
string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
Ответ 18
Я пытаюсь найти исправление для этой же проблемы в течение пары дней. Я смог разрешить это, добавив ключ в тег appsettings в файле web.config. Это должно переопределить .dll при использовании помощника.
<configuration>
<appSettings>
<add key="loginUrl" value="~/RedirectValue.cshtml" />
<add key="autoFormsAuthentication" value="false"/>
</appSettings>
</configuration>
Ответ 19
Другое возможное решение:
var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
Ответ 20
Вы можете использовать ниже линии, в моем случае это работало:
System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]
Вы должны позаботиться о том, чтобы вышеприведенная строка кода также была старой версией и не рекомендуется в новых библиотеках.
Ответ 21
ConfigurationManager - это не то, что вам нужно для доступа к вашим собственным настройкам.
Для этого вы должны использовать
{YourAppName}.Properties.Settings.{settingName}
Ответ 22
Пожалуйста, проверьте .NET версию, которую вы работаете. Должно быть больше 4. И вы должны добавить системную библиотеку System.Configuration в ваше приложение.
Ответ 23
Мне удалось получить подход ниже, работая для проектов .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);
}
'
Ответ 24
вот пример: App.config
<applicationSettings>
<MyApp.My.MySettings>
<setting name="Printer" serializeAs="String">
<value>1234 </value>
</setting>
</MyApp.My.MySettings>
</applicationSettings>
Dim strPrinterName as string= My.settings.Printer