缺少<;configSections>;在部署后的配置文件中

本文关键字:配置文件 部署 gt lt configSections 缺少 | 更新日期: 2023-09-27 18:22:08

更新:我在下面有一个问题,但实际上我的问题可以通过问一个稍微不同的问题来解决。为什么在某些机器上我的应用程序会抛出错误:

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

而在其他机器上则不然。此处也描述了此错误。.NET 3.5-配置系统未能初始化异常是由我的app.config顶部缺少configSections元素引起的。当然,可以通过放入此节来解决此问题,但由于某种原因,我的项目解决方案中具有此节的app.confic不是部署后在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>

一些背景。我正在运行outlook2007和2010的win7机器上通过点击一次visualstudio安装程序部署一个vsto插件。

外接程序将一些设置读取并写入app.config文件,与exe不同,该文件存储在本地用户的appdata文件夹中。

然而,在一些机器上,我收到一个错误"配置系统未能在system.Configuration.ConfigurationManager.PrepareConfigSystem()处初始化-system.Configuration"在我的案例中,这是由xml中上述缺失的元素引起的。但是,在其他计算机上,configSections并没有丢失。该问题与正在使用的Outlook版本无关。

缺少<;configSections>;在部署后的配置文件中

我昨天在VSTO DLL项目中遇到了同样的问题,我仍然不明白为什么有时会缺少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);
    }

[app name].exe.config文件是一个安装时配置文件,user.config文件是在运行时将用户设置保存到应用程序中时在用户的AppData文件夹中的某个位置创建/覆盖的文件。

我只是通过实验确定,当.exe.config文件与我的应用程序一起安装时,当应用程序保存其user.config文件时,它认为不需要在user.config中写入XML的<configSections><sectionGroup name="userSettings"...部分,因为XML的该部分已经在已安装的.exe.config文件中定义。但是,如果我没有在应用程序中安装.exe.config文件,那么当应用程序保存其user.config文件时,它会将XML的<configSections><sectionGroup name="userSettings"...部分写入user.config文档,因为没有.exe.config文档来定义该部分。

如果用户的计算机上有一个现有的user.config文件,该文件是由以前安装的应用程序版本创建的,但该版本确实安装了.exe.config文件,然后如果在未安装.exe.config的情况下重新安装该应用程序,则在.exe.config文件或现有user.settings文件中都未定义XML的<configSections><sectionGroup name="userSettings"...节,这导致程序无法从user.config文件中读取节,因此在程序第一次尝试访问用户设置时会抛出System.Configuration.ConfigurationErrorsException