无法识别的配置部分 userSettings 但调试工作正常

Unrecognized configuration section userSettings but Debug works fine

我的应用程序在调试时运行良好,但是当我尝试在 visual studio 之外 运行 它时,它总是崩溃,我在事件查看器中所能找到的就是这个:

Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Configuration.ConfigurationErrorsException
   at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean)
   at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(System.Configuration.ConfigurationSchemaErrors)
   at System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors()
   at System.Configuration.ClientConfigurationSystem.OnConfigRemoved(System.Object, System.Configuration.Internal.InternalConfigEventArgs)

Exception Info: System.Configuration.ConfigurationErrorsException
   at System.Configuration.ConfigurationManager.PrepareConfigSystem()
   at System.Configuration.ConfigurationManager.RefreshSection(System.String)
   at System.Configuration.ClientSettingsStore.ReadSettings(System.String, Boolean)
   at System.Configuration.LocalFileSettingsProvider.GetPropertyValues(System.Configuration.SettingsContext, System.Configuration.SettingsPropertyCollection)
   at System.Configuration.SettingsBase.GetPropertiesFromProvider(System.Configuration.SettingsProvider)
   at System.Configuration.SettingsBase.GetPropertyValueByName(System.String)
   at System.Configuration.SettingsBase.get_Item(System.String)
   at System.Configuration.ApplicationSettingsBase.GetPropertyValue(System.String)
   at System.Configuration.ApplicationSettingsBase.get_Item(System.String)
   at LeagueFPSBoost.Properties.Settings.get_UpgradeRequired()
   at LeagueFPSBoost.Program.CreateConfigIfNotExists()
   at LeagueFPSBoost.Program.Startup(System.String[])
   at LeagueFPSBoost.Program.Main(System.String[])

它工作正常,我只是不知道它发生了什么。这里有更多信息:

static void CreateConfigIfNotExists()
{
    var configFile = $"{Application.ExecutablePath}.config";
    if (!File.Exists(configFile))
    {
        File.WriteAllText(configFile, Resources.App_Config);
    }

    var configDir = Path.Combine(leagueConfigDirPath, @"LeagueFPSBoost\");
    if (!Directory.Exists(configDir))
    {
        Directory.CreateDirectory(configDir);
    }
    if (!File.Exists(Path.Combine(configDir, "App.config")))
    {
        File.WriteAllText(Path.Combine(configDir, "App.config"), Resources.App_Config);
    }

    AppConfig.Change(Path.Combine(configDir, "App.config"));

    if (File.Exists(configFile))
    {
        File.Delete(configFile);
    }

    if (Settings.Default.UpgradeRequired) //Exception Thrown Here
    {
        Settings.Default.Upgrade();
        Settings.Default.UpgradeRequired = false;
        Settings.Default.Save();
    }
}

这是来自 Settings.Desinger.cs:

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool UpgradeRequired {
    get {
        return ((bool)(this["UpgradeRequired"]));
    }
    set {
        this["UpgradeRequired"] = value;
    }
}

这里是App.config:

<?xml version="1.0" encoding="utf-8"?>
<!-- User settings like theme and etc are stored in ...\AppData\Local\LeagueFPSBoost\... -->
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="LeagueFPSBoost.Properties.Settings" 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" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <userSettings>
    <LeagueFPSBoost.Properties.Settings>
      <setting name="ThemeStyle" serializeAs="String">
        <value>Light</value>
      </setting>
      <setting name="ColorStyle" serializeAs="String">
        <value>Blue</value>
      </setting>
      <setting name="Notifications" serializeAs="String">
        <value>True</value>
      </setting>
      <setting name="Log" serializeAs="String">
        <value>True</value>
      </setting>
      <setting name="UpgradeRequired" serializeAs="String">
        <value>True</value>
      </setting>
    </LeagueFPSBoost.Properties.Settings>
  </userSettings>
</configuration>

当应用程序在调试模式下从 Visual Studio 启动时,每次都一切正常。问题是当我通过单击 exe 运行 应用程序时它第一次工作(如果 user.config 不存在于 roaming/local/appname.. 文件夹中)。我 运行 通过单击 exe 第二次申请我每次都得到相同的错误。但是当我删除 user.config 文件时,它会再次正常启动,但它不会以 user.config 在那里开始....

这是user.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <LeagueFPSBoost.Properties.Settings>
            <setting name="ThemeStyle" serializeAs="String">
                <value>Dark</value>
            </setting>
            <setting name="ColorStyle" serializeAs="String">
                <value>Red</value>
            </setting>
            <setting name="Notifications" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="Log" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="UpgradeRequired" serializeAs="String">
                <value>False</value>
            </setting>
        </LeagueFPSBoost.Properties.Settings>
    </userSettings>
</configuration>

有时我也会遇到这个异常:

System.Configuration.ConfigurationErrorsException: Unrecognized configuration section userSettings 
(C:\Users\...\AppData\Local\LeagueFPSBoost\LeagueFPSBoost.exe_Url_10kxs4....xzo1.8.0.0\user.config line 3)

我尝试将 2.8.0.0 增加到 2.9.0.0,但我仍然遇到同样的问题。

之前还好好的,不知道怎么回事

编辑:我找到了通过攻击调试器处理抛出异常的地方,但我仍然不知道为什么?

编辑 2:我发现添加:

<configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="LeagueFPSBoost.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>

到 user.config 解决了问题,但为什么它一开始就不见了?

我找到了答案 here

我修改了一段代码使其通用:

/// <summary>
/// Corrects the roaming settings file if needed because sometimes the node "configSections" is missing in the settings file. 
/// Correct this by taking this node out of the default config file.
/// </summary>
private static void CorrectRoamingSettingsFileIfNeeded()
{
    const string NODE_NAME_CONFIGURATION = "configuration";
    const string NODE_NAME_CONFIGSECTIONS = "configSections";
    const string NODE_NAME_USERSETTINGS = "userSettings";

    //Exit if no romaing config (file) to correct...
    var configRoaming = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    if (configRoaming == null) return;
    if (!configRoaming.HasFile) return;

    //Check for the <sectionGroup> with name="userSettings"
    //Note: Used ugly iteration because "configRoaming.GetSectionGroup(sectionGroupName)" throws ArgumentException.
    ConfigurationSectionGroup sectionGroupUserSettings = null;
    foreach (ConfigurationSectionGroup sectionGroup in configRoaming.SectionGroups)
    {
        if (sectionGroup.Name.Equals(NODE_NAME_USERSETTINGS))
        {
            sectionGroupUserSettings = sectionGroup;
            break;
        }
    }

    //Exit if the needed section group is found...
    if (sectionGroupUserSettings != null && sectionGroupUserSettings.IsDeclared) return;

    //Do correction actions...
    var xDoc = XDocument.Load(configRoaming.FilePath);
    var userSettingsNode = xDoc.Element(NODE_NAME_CONFIGURATION).Element(NODE_NAME_USERSETTINGS);

    var ConfigFullFilename = Assembly.GetEntryAssembly().Location;
    var configDefault = ConfigurationManager.OpenExeConfiguration(ConfigFullFilename);
    var xDocDefault = XDocument.Load(configDefault.FilePath);
    var configSectionsNode = xDocDefault.Element(NODE_NAME_CONFIGURATION).Element(NODE_NAME_CONFIGSECTIONS);

    userSettingsNode.AddBeforeSelf(configSectionsNode);
    xDoc.Save(configRoaming.FilePath);
}

那真是令人困惑....

虽然这与 OP 没有直接关系,但这是 post 用户在搜索此错误时被发送到的,因此值得在这里指出,因为它是相关的。

使用 system.Configuration.ConfigurationManager 4.7.0 添加 app.config 时,.Net Core 中会出现此错误:

ConfigurationErrorsException:无法识别的配置节添加。 (C:\Source\Repos\SFTP_Application\SFTP_Application\SFTP_Application_Console\bin\Debug\netcoreapp3.1\SFTP_Application_Console.dll.config 第 3 行)

Unrecognized configuration section add 意思是:它少了一个“section”,它认为<add>是一个section。

在 .Net Core 的情况下,它最初是为了 运行 关闭 .json 而构建的,但并不是每个人都喜欢单独 运行 关闭他们的站点。json。因此,您可以添加 .config 文件,但开箱即用的文件缺少 <appSettings> 部分。把你的钥匙放进去,然后你就可以走了。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ApplicationId" value="0" />
    <!--SqlConnections-->
    <add key="sql_Con_String" value="mydsstring" />
  </appSettings>
  
</configuration>