【问题标题】:Unrecognized configuration section userSettings but Debug works fine无法识别的配置部分 userSettings 但调试工作正常
【发布时间】:2018-06-20 04:02:40
【问题描述】:

我的应用程序在调试时运行良好,但是当我尝试在 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\2.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 解决了问题,但为什么它首先在那里丢失?

【问题讨论】:

标签: c# exception config


【解决方案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);
}

这真是令人困惑......

【讨论】:

    【解决方案2】:

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

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

    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”,它认为&lt;add&gt;是一个section。

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

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

    【讨论】:

    • 我是用网络框架而不是核心做的,但谢谢你的信息。 ??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多