我正面临一个问题。
我想在app.config文件中保存设置
我在配置文件中编写了单独的类和定义的部分..
但是当我运行应用程序时。它不会将给定值保存到配置文件
中这里是SettingsClass
public class MySetting:ConfigurationSection
{
private static MySetting settings = ConfigurationManager.GetSection("MySetting") as MySetting;
public override bool IsReadOnly()
{
return false;
}
public static MySetting Settings
{
get
{
return settings;
}
}
[ConfigurationProperty("CustomerName")]
public String CustomerName
{
get
{
return settings["CustomerName"].ToString();
}
set
{
settings["CustomerName"] = value;
}
}
[ConfigurationProperty("EmailAddress")]
public String EmailAddress
{
get
{
return settings["EmailAddress"].ToString();
}
set
{
settings["EmailAddress"] = value;
}
}
public static bool Save()
{
try
{
System.Configuration.Configuration configFile = Utility.GetConfigFile();
MySetting mySetting = (MySetting )configFile.Sections["MySetting "];
if (null != mySetting )
{
mySetting .CustomerName = settings["CustomerName"] as string;
mySetting .EmailAddress = settings["EmailAddress"] as string;
configFile.Save(ConfigurationSaveMode.Full);
return true;
}
return false;
}
catch
{
return false;
}
}
}
这是我在配置文件中保存信息的代码
private void SaveCustomerInfoToConfig(String name, String emailAddress)
{
MySetting .Settings.CustomerName = name;
MySetting .Settings.EmailAddress = emailAddress
MySetting .Save();
}
这是app.config
<configuration>
<configSections>
<section name="MySettings" type="TestApp.MySettings, TestApp"/>
</configSections>
<MySettings CustomerName="" EmailAddress="" />
</configuration>
你可以告诉我错误在哪里..我尝试了很多并从互联网上阅读。但仍然无法在配置文件中保存信息..
我也通过双击exe文件来运行应用程序。
答案 0 :(得分:5)
根据MSDN: ConfigurationManager.GetSection Method,
ConfigurationManager.GetSection
方法访问运行时配置信息 无法更改 。要更改配置,请使用以下Open方法之一在配置文件上使用Configuration.GetSection
方法:
但是,如果要更新app.config文件,我会将其作为xml文档读取并将其作为普通的xml文档进行操作。
请参阅以下示例: 注意:此示例仅用于概念验证。不应该在生产中使用。
using System;
using System.Linq;
using System.Xml.Linq;
namespace ChangeAppConfig
{
class Program
{
static void Main(string[] args)
{
MyConfigSetting.CustomerName = "MyCustomer";
MyConfigSetting.EmailAddress = "MyCustomer@Company.com";
MyConfigSetting.TimeStamp = DateTime.Now;
MyConfigSetting.Save();
}
}
//Note: This is a proof-of-concept sample and
//should not be used in production as it is.
// For example, this is not thread-safe.
public class MyConfigSetting
{
private static string _CustomerName;
public static string CustomerName
{
get { return _CustomerName; }
set
{
_CustomerName = value;
}
}
private static string _EmailAddress;
public static string EmailAddress
{
get { return _EmailAddress; }
set
{
_EmailAddress = value;
}
}
private static DateTime _TimeStamp;
public static DateTime TimeStamp
{
get { return _TimeStamp; }
set
{
_TimeStamp = value;
}
}
public static void Save()
{
XElement myAppConfigFile = XElement.Load(Utility.GetConfigFileName());
var mySetting = (from p in myAppConfigFile.Elements("MySettings")
select p).FirstOrDefault();
mySetting.Attribute("CustomerName").Value = CustomerName;
mySetting.Attribute("EmailAddress").Value = EmailAddress;
mySetting.Attribute("TimeStamp").Value = TimeStamp.ToString();
myAppConfigFile.Save(Utility.GetConfigFileName());
}
}
class Utility
{
//Note: This is a proof-of-concept and very naive code.
//Shouldn't be used in production as it is.
//For example, no null reference checking, no file existence checking and etc.
public static string GetConfigFileName()
{
const string STR_Vshostexe = ".vshost.exe";
string appName = Environment.GetCommandLineArgs()[0];
//In case this is running under debugger.
if (appName.EndsWith(STR_Vshostexe))
{
appName = appName.Remove(appName.LastIndexOf(STR_Vshostexe), STR_Vshostexe.Length) + ".exe";
}
return appName + ".config";
}
}
}
我还在app.config中为MySettings添加了“TimeStamp”属性,以便轻松检查结果。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MySettings" type="TestApp.MySettings, TestApp"/>
</configSections>
<MySettings CustomerName="" EmailAddress="" TimeStamp=""/>
</configuration>
答案 1 :(得分:3)
在许多情况下(在受限用户场景中),用户没有直接对应用程序配置文件的写访问权限。要解决这个问题,您需要使用usersettings。
如果右键单击项目并选择名为“设置”的选项卡,则可以列出与配置文件一起存储的设置。如果选择“范围”为“用户”,则设置将自动存储在配置文件中,该类型将自动将设置存储在用户AppData区域下,用户始终具有写访问权限。这些设置也会自动作为在Properties \ Settings.Designer.cs代码文件中创建的属性提供,并可在Properties.Settings.Default
的代码中访问。
假设您添加了名为客户名称的用户设置:
在加载应用程序时,您需要从存储的设置中检索该值(默认值,因为它在应用程序配置中,或者如果它是为该用户存储的,则为用户的配置文件):
string value = Properties.Settings.Default.CustomerName;
如果要更改值,只需写入:
Properties.Settings.Default.CustomerName = "John Doe";
如果要保存所有设置,只需调用保存:
Properties.Settings.Default.Save();
请注意,在开发时,用户文件将重置为默认值,但这仅在构建应用程序时才会发生。当您运行该应用程序时,您存储的设置将从应用程序的用户配置文件中读取。
如果您仍想创建自己的设置处理,可以尝试一次,并查看VisualStudio自动为您创建的内容,以了解实现此功能所需的内容。
答案 2 :(得分:2)
为了实际更新配置文件,您需要在.Save()
对象上调用Configuration
- 而不仅仅是您的配置部分对象。
你应该在CodeProject上查看Jon Rista关于.NET 2.0配置的三部分系列文章。
强烈推荐,写得很好,非常有帮助!它显示了处理.NET 2.0和up配置的所有细节,并帮助我非常了解这个主题。
马克
答案 3 :(得分:2)
请注意,appname.vshost.exe.Config将恢复为调试会话结束时的原始状态。因此,您可能正在保存到文件中(可以在执行期间使用记事本进行检查),然后在调试停止时丢失保存的内容。