在运行时替换 app.config
Replacing app.config at runtime
这是我的应用程序配置:
<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");
我收到一条错误消息,提示未授权访问。 (我相信这是因为我的学校网络)
这两个选项到目前为止都没有用。我还尝试将 ConfigurationManager.ConnectionStrings["cn"]
设置为我的自定义 connectionString。由于它是只读的,因此也失败了。还有其他想法可以在运行时替换 connectionString 吗?
提前致谢。
更改应用程序配置文件必须在您的应用程序启动之前完成,因为某些键仅在您的应用程序启动时由运行时读取,而其他键则变为只读。
您只能通过引用 System.Configuration
程序集来动态更改 AppSettings
部分的配置条目。所有其他键在设计上都是只读的。
如果您不想在启动应用程序之前更改配置,则需要考虑所有涉及的实体:谁将读取您的连接字符串?如果是您,您可以简单地将其存储在其他地方,甚至存储在 AppSettings
键中。相反,如果外部组件需要从您的配置文件中读取它,您就没有机会更改您的应用程序的体系结构,以便在 运行 您的应用程序之前拥有一个进行更改的包装器。
在引用 System.Configuration
程序集 之后,AppSettings
键不能以这种方式更改(这很重要)。
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}.");
}
}
}
这是我的应用程序配置:
<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");
我收到一条错误消息,提示未授权访问。 (我相信这是因为我的学校网络)
这两个选项到目前为止都没有用。我还尝试将 ConfigurationManager.ConnectionStrings["cn"]
设置为我的自定义 connectionString。由于它是只读的,因此也失败了。还有其他想法可以在运行时替换 connectionString 吗?
提前致谢。
更改应用程序配置文件必须在您的应用程序启动之前完成,因为某些键仅在您的应用程序启动时由运行时读取,而其他键则变为只读。
您只能通过引用 System.Configuration
程序集来动态更改 AppSettings
部分的配置条目。所有其他键在设计上都是只读的。
如果您不想在启动应用程序之前更改配置,则需要考虑所有涉及的实体:谁将读取您的连接字符串?如果是您,您可以简单地将其存储在其他地方,甚至存储在 AppSettings
键中。相反,如果外部组件需要从您的配置文件中读取它,您就没有机会更改您的应用程序的体系结构,以便在 运行 您的应用程序之前拥有一个进行更改的包装器。
在引用 System.Configuration
程序集 之后,AppSettings
键不能以这种方式更改(这很重要)。
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}.");
}
}
}