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>

我做错了什么?

ConfigurationManager use

好的,我有你的问题的解决方案。

解释起来并不容易,因为这并不是你的错,VS有一个bug已经拖了好几年了。

所以让我们循序渐进:

  1. 使用右键单击项目并转到设置选项卡添加设置-路径不正确。。原因如下:

如果我们遵循文档,我们所要做的就是:

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的应用程序——我没有测试过。(哦,只是为了明确一点:"这是垃圾"意味着通过右键单击项目菜单并转到设置选项卡来添加设置文件)

  1. 好的。。。让我们尝试另一种方法,即从"添加新项"菜单添加设置文件,其默认文件名将为"settings1.settings",并且它将位于常规项目文件夹名称下,而不是以前的属性下

所以我也这样做了,并测试了以下线路:

var oldSetting = Settings1.Default.Server;
Settings1.Default.Server = "localhost2";
Settings1.Default.Save();

这起到了作用,但我需要告诉你,"范围"必须是"用户",而不是"应用程序"。。如果其"应用程序",则该设置将没有setter。。它把信息保存在哪里了?在该用户的AppData文件夹中。。这是合乎逻辑的。

这当然意味着,为了在调试保存的内容时手动检查,您需要转到应用程序的配置文件,该文件位于AppData文件夹中,而不是debug/bin文件夹中。

  1. 但这一切当然不是你所要求的。。。因为您想保存"应用程序"范围设置,对吗?好你不能——它们不是为这个而设计的。您可以在此处阅读: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>

根据评论中的要求,这里有一个错误报告的链接:
应用程序中的配置。配置和应用程序设置