Отсутствует <configSections>в файле конфигурации после развертывания - PullRequest
3 голосов
/ 02 февраля 2012

Обновление: у меня был вопрос ниже, но фактически моя проблема была бы решена, задав немного другой вопрос. Почему на некоторых машинах мое приложение выдает ошибку:

Configuration system failed to initialize - System.Configuration -    at     System.Configuration.ConfigurationManager.PrepareConfigSystem()

где как на других машинах его нет. Ошибка, описанная также здесь .NET 3.5 - системе конфигурации не удалось инициализировать исключение , вызвана отсутствием элемента configSections в верхней части моего app.config. Конечно, проблему можно решить, вставив этот раздел, но по какой-то причине файл app.config в моем проекте, в котором есть этот раздел, не является тем, который создается в папке appdata после развертывания.

Оригинальный вопрос:

Почему в моем пользовательском конфигурационном файле этот раздел отсутствует при развертывании на некоторых компьютерах, а не на других? Как я могу убедиться, что это не пропало.

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

Некоторый фон. Я развертываю надстройку vsto с помощью установщика Visual Studio, запускаемого одним щелчком мыши, на машинах win 7, работающих под управлением outlook 2007 и 2010.

Надстройка считывает и записывает некоторые настройки в файл app.config, который в отличие от exe-файла сохраняется в папке appdata локальных пользователей.

Однако на некоторых компьютерах появляется сообщение об ошибке «Не удалось инициализировать систему конфигурации - System.Configuration - в System.Configuration.ConfigurationManager.PrepareConfigSystem ()» который в моем случае вызван отсутствующим элементом в XML. Однако на других машинах configSections не отсутствует. Проблема не связана с используемой версией Outlook.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2013

Вчера у меня была такая же проблема в моем проекте VSTO DLL, и я до сих пор не понимаю причину, по которой иногда с with name = "userSettings" иногда не хватает.Но я могу предоставить свое решение: я создал функцию, которая копирует отсутствующую часть XML (если она отсутствует) из фиксированного файла .dll.config в файл конфигурации в каталоге ROAMING:

    /// <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";
        const string ADDIN_DLL_FILENAME = "MyAddIn.dll";

        //Exit if no romaing config (file) to correct...
        var configRoaming = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
        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 addInDllConfigFullFilename = AppDomain.CurrentDomain.BaseDirectory + ADDIN_DLL_FILENAME;
        var configDefault = ConfigurationManager.OpenExeConfiguration(addInDllConfigFullFilename);
        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 голос
/ 12 марта 2018

Файл [имя приложения] .exe.config - это файл конфигурации во время установки, а файл user.config - это файл, который создается / перезаписывается где-то в папке AppData пользователя, когда вы сохраняете настройки пользователя в своем приложении в во время выполнения.

Я только что экспериментально определил, что когда файл .exe.config устанавливается вместе с моим приложением, то когда приложение сохраняет свой файл user.config, оно думает, что ему не нужно записывать секцию <configSections><sectionGroup name="userSettings"... XML в файл user.config, поскольку этот раздел XML уже определен в установленном файле .exe.config. Однако, если я не установлю этот файл .exe.config вместе с моим приложением, то, когда приложение сохранит свой файл user.config, оно записывает секцию XML <configSections><sectionGroup name="userSettings"... в файл user.config, поскольку его нет. exe.config файл для определения этого раздела.

Проблема возникает, когда на компьютере пользователя существует существующий файл user.config, созданный ранее установленной версией приложения, в которой был установлен файл .exe.config, а затем, если вы переустановите приложение без установленного файла .exe.config раздел XML <configSections><sectionGroup name="userSettings"... не определен ни в файле .exe.config, ни в существующем файле user.settings, что приводит к невозможности чтения раздела из файл user.config, поэтому он выдает System.Configuration.ConfigurationErrorsException при первой попытке программы получить доступ к пользовательской настройке.

...