部署后缺少配置文件中的<configsections> </configsections>

时间:2012-02-02 11:25:04

标签: c# outlook vsto app-config

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

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

与其他机器上的情况不同。此处.NET 3.5 - Configuration system failed to initialize exception中描述的错误是由app.config顶部缺少configSections元素引起的。当然,问题可以通过放入此部分来解决,但由于某种原因,我的项目解决方案中的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>

一些背景知识。我正在运行outlook 2007和2010的win 7机器上通过一次点击Visual Studio安装程序部署vsto加载项。

加载项将一些设置读取和写入app.config文件,这与exe不同,它存储在本地用户的appdata文件夹中。

在某些机器上但是我收到错误“配置系统无法初始化 - System.Configuration - 在System.Configuration.ConfigurationManager.PrepareConfigSystem()” 在我的情况下,这是由xml中上面缺少的元素引起的。但是在其他机器上,configSections不会丢失。该问题与正在使用的Outlook版本无关。

2 个答案:

答案 0 :(得分:2)

我昨天在我的VSTO DLL项目中遇到了同样的问题,但我仍然不明白为什么有些名称=“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 :(得分:1)

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

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

当用户计算机上存在由安装了.exe.config文件的先前安装的应用程序版本创建的现有user.config文件时,如果您重新安装该应用程序,则会出现问题如果没有安装.exe.config文件,则无法在.exe.config文件或现有user.settings文件中定义XML的<configSections><sectionGroup name="userSettings"...部分,这会导致程序无法读取该部分来自user.config文件,因此它在程序第一次尝试访问用户设置时抛出System.Configuration.ConfigurationErrorsException