Замена app.config во время выполнения
Вот мой appconfig:
<connectionStrings>
<add name ="cn" connectionString="User ID=YOUR_USER_HERE; Password=YOUR_PASS_HERE;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=.)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=.)));"/>
</connectionStrings>
Я попробовал эту функцию:
public void updateConfigFile(string con)
{
//updating config file
XmlDocument XmlDoc = new XmlDocument();
//Loading the Config file
XmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
foreach (XmlElement xElement in XmlDoc.DocumentElement)
{
if (xElement.Name == "connectionStrings")
{
{
xElement.FirstChild.Attributes[1].Value = con;
}
}
}
//writing the connection string in config file
XmlDoc.Save("App.config");
}
Это не сработало. Это бежало без любой ошибки. Но это не сохранило connectionString в файле appconfig. Я также попробовал эту идею:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
connectionStringsSection.ConnectionStrings["Blah"].ConnectionString = "Data Source=blah;Initial Catalog=blah;UID=blah;password=blah";
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");
Я получаю сообщение об ошибке UnauthorizedAccess. (Я верю, что это из-за моей школьной сети)
Эти два варианта не сработали до сих пор. Я также пытался установить ConfigurationManager.ConnectionStrings["cn"]
на мою пользовательскую строку подключения. Так как это только для чтения, это тоже не удалось. Есть ли другая идея, что я могу заменить connectionString во время выполнения?
Заранее спасибо.
1 ответ
Изменение файла конфигурации приложения должно быть выполнено до запуска приложения, так как некоторые ключи читаются средой выполнения только тогда, когда ваше приложение загружается, а другие - только для чтения.
Вы можете динамически изменять записи конфигурации AppSettings
раздел только путем ссылки на System.Configuration
сборка. Все остальные ключи предназначены только для чтения.
Если вы не хотите изменять конфигурацию перед запуском приложения, вам нужно подумать обо всех задействованных объектах: кто будет читать вашу строку подключения? Если это вы, вы можете просто сохранить его где-то еще или даже в AppSettings
ключ. Вместо этого, если внешним компонентам требуется прочитать его из файла конфигурации, у вас нет шансов изменить архитектуру вашего приложения, чтобы иметь оболочку, которая вносит изменения перед запуском вашего приложения.
AppSettings
ключ может быть изменен таким образом, после System.Configuration
сборка (это жизненно важно).
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="key1" value="configuration"/>
</appSettings>
</configuration>
Program.cs
using System;
using System.Configuration;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
System.Configuration.ConfigurationManager.AppSettings["key1"] = "changed";
var value = System.Configuration.ConfigurationManager.AppSettings["key1"];
Console.WriteLine($"This is the new key: {value}.");
}
}
}