ConfigurationManager use
本文关键字:use ConfigurationManager | 更新日期: 2023-09-27 17:59:31
我编写了以下代码来获取ConfigurationManager数据,并对其进行更新:
private static void UpdateConfigurationFile()
{
#if DEBUG
string applicationName =
Environment.GetCommandLineArgs()[0];
#else
string applicationName =
Environment.GetCommandLineArgs()[0]+ ".exe";
#endif
string exePath = System.IO.Path.Combine(
Environment.CurrentDirectory, applicationName);
// Get the configuration file. The file name has
// this format appname.exe.config.
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(exePath);
string server = ConfigurationManager.AppSettings["server"];
}
在代码的末尾,服务器为null。
XML具有相应的服务器代码:
<applicationSettings>
<forLiDAR.Properties.Settings>
<setting name="Server" serializeAs="String">
<value>localhost</value>
</setting>
我做错了什么?
好的,我有你的问题的解决方案。
解释起来并不容易,因为这并不是你的错,VS有一个bug已经拖了好几年了。
所以让我们循序渐进:
- 使用右键单击项目并转到设置选项卡添加设置-路径不正确。。原因如下:
如果我们遵循文档,我们所要做的就是:
Properties.Settings.Default.Server = "Now I'm something different than localhost";
Properties.Settings.Default.Save();
不需要OpenExeConfiguration或其他任何东西,只需要这两行!和NET的魅力应该能够将新设置保存到配置文件中。。除了它没有:)相反,它会大喊"配置系统无法初始化"!!
所以。。我们认为"好吧,他们没有在文档中涵盖所有内容。让我们添加我们认为缺失的内容。"因此我们添加:
var exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "ConsoleApplication58.vshost.exe.config");
var config = ConfigurationManager.OpenExeConfiguration(exePath);
var oldSetting = config.AppSettings.Settings["Server"].Value;
我们会得到。。。这次是另一个异常-空引用。所以我们问-"那里发生了什么?!"然后从调试开始,我们添加了对"配置"的监视。应用程序设置。"设置",让我们感到恐怖的是,我们看到了这一点。NET实际上试图告诉我们"没有勺子…"(或设置计数为0)
因此,在这一点上,我们可以得出结论,这种垃圾肯定不能用于使用AppConfig的应用程序。。但它可能适用于使用WebConfig的应用程序——我没有测试过。(哦,只是为了明确一点:"这是垃圾"意味着通过右键单击项目菜单并转到设置选项卡来添加设置文件)
- 好的。。。让我们尝试另一种方法,即从"添加新项"菜单添加设置文件,其默认文件名将为"settings1.settings",并且它将位于常规项目文件夹名称下,而不是以前的属性下
所以我也这样做了,并测试了以下线路:
var oldSetting = Settings1.Default.Server;
Settings1.Default.Server = "localhost2";
Settings1.Default.Save();
这起到了作用,但我需要告诉你,"范围"必须是"用户",而不是"应用程序"。。如果其"应用程序",则该设置将没有setter。。它把信息保存在哪里了?在该用户的AppData文件夹中。。这是合乎逻辑的。
这当然意味着,为了在调试保存的内容时手动检查,您需要转到应用程序的配置文件,该文件位于AppData文件夹中,而不是debug/bin文件夹中。
- 但这一切当然不是你所要求的。。。因为您想保存"应用程序"范围设置,对吗?好你不能——它们不是为这个而设计的。您可以在此处阅读:https://msdn.microsoft.com/en-us/library/aa730869(v=vs.80).aspx
ApplicationSettings类没有支持将设置保存到app.config文件。这是由设计,使用安全用户帐户(想想Vista UAC)没有对的写访问权限程序的安装文件夹。
你可以用ConfigurationManager类。但是琐碎的变通方法是设置设计器并更改设置的范围为"用户"。如果导致困难(例如,环境与每个用户相关),您应该将选项功能放在单独的程序,以便您可以要求特权提升提示。或放弃使用设置。
所以,最后我将向你展示你的应用程序应该是什么样子:
namespace ConsoleApplication58
{
class Program
{
static void Main(string[] args)
{
UpdateConfigurationFile();
}
private static void UpdateConfigurationFile()
{
var oldSetting = Settings1.Default.Server; //to get the current setting if you want..
Settings1.Default.Server = "localhost2"; //to change the setting.
Settings1.Default.Save(); //to save settings.
}
}
}
如果你像我提到的那样添加Settings1.Settings文件,这就是appConfig的样子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication58.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<userSettings>
<ConsoleApplication58.Settings1>
<setting name="Server" serializeAs="String">
<value>localhost</value>
</setting>
</ConsoleApplication58.Settings1>
</userSettings>
</configuration>
根据评论中的要求,这里有一个错误报告的链接:
应用程序中的配置。配置和应用程序设置