1

My app is working fine when debugging but when I'm trying to run it outside visual studio it just keeps crashing and all what I can find is this in event viewer:

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[])

It was working fine, i just dont know what happened to it. Here is more info:

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();
    }
}

And this is from 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;
    }
}

Here is 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>

When application starts from Visual Studio in debug mode everything works fine every time. Problem is when I run application by clicking on exe it works first time (if user.config doesn't exist in roaming/local/appname.. folder). One I run application for second time by clicking on exe I just get the same error every time. But when I delete user.config file it starts again normally but it just wont start with user.config being there....

This is 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>

Sometimes I'm also getting this exception:

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)

I tried incrementing 2.8.0.0 to 2.9.0.0 but I still got same problem.

It was working fine before, I don't know what happened to it.

Edit: I found out where exception is thrown by attacking debugger to process but still I don't know why?

Image

Edit 2: I found out that adding:

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

to the user.config fixes the problem but why is it missing in there in first place?

halfer
  • 19,824
  • 17
  • 99
  • 186
Nicky
  • 87
  • 1
  • 13
  • Please read [Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers?](//meta.stackoverflow.com/q/326569) - the summary is that this is not an ideal way to address volunteers, and is probably counterproductive to obtaining answers. Please refrain from adding this to your questions. – halfer Jun 20 '18 at 15:58

2 Answers2

3

I've found answer here.

I have modified a code a bit so that its universal:

/// <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);
}

That was confusing as hell....

Nicky
  • 87
  • 1
  • 13
1

While this is not directly related to the OP, this is the post users are sent to when searching for this error, so it is worth pointing out here as it is related.

This error occurs in .Net Core when adding an app.config using system.Configuration.ConfigurationManager 4.7.0:

ConfigurationErrorsException: Unrecognized configuration section add. (C:\Source\Repos\SFTP_Application\SFTP_Application\SFTP_Application_Console\bin\Debug\netcoreapp3.1\SFTP_Application_Console.dll.config line 3)

Unrecognized configuration section add means: it is missing a "section" and it thinks that <add> is a section.

In .Net Core's case, it is originally built to run off .json, but not everyone likes running their site off .json alone. So, you can add a .config file, but out of the box that file is missing an <appSettings> section. Put your keys in that, and your good to go.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ApplicationId" value="0" />
    <!--SqlConnections-->
    <add key="sql_Con_String" value="mydsstring" />
  </appSettings>
  
</configuration>
Patrick Knott
  • 1,666
  • 15
  • 15