无法识别的配置部分userSettings,但Debug可以正常运行

时间:2018-06-20 04:02:40

标签: c# exception config

我的应用在调试时运行良好,但是当我尝试在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)。我通过单击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\2.8.0.0\user.config line 3)

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

以前运行良好,我不知道发生了什么事。

编辑:我发现通过攻击调试器进行处理而在哪里抛出了异常,但我仍然不知道为什么?

Image

编辑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解决了该问题,但是为什么在此首先找不到它?

2 个答案:

答案 0 :(得分:1)

我找到了答案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);
}

那真是令人困惑,...

答案 1 :(得分:1)

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

使用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行)

无法识别的配置部分添加意味着:它缺少一个“部分”,并且认为<add>是一个部分。

在.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>