【问题标题】:Missing <configSections> in config file after deployment部署后配置文件中缺少 <configSections>
【发布时间】:2012-02-25 01:24:38
【问题描述】:

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

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>

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

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

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

【问题讨论】:

  • 我今天也遇到了这个问题。你有没有找到解决办法?
  • @BLSully:我在下面发布了一个解决方案...

标签: c# outlook vsto app-config


【解决方案1】:

我昨天在我的 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);
    }

【讨论】:

    【解决方案2】:

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

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

    如果用户计算机上存在由先前安装的应用程序版本创建的现有 user.config 文件,并且确实安装了 .exe.config 文件,然后如果您重新安装该应用程序,则会出现问题如果未安装 .exe.config 文件,则 XML 的 &lt;configSections&gt;&lt;sectionGroup name="userSettings"... 部分未在 .exe.config 文件或现有 user.settings 文件中定义,这会导致程序无法从user.config 文件,因此在程序第一次尝试访问用户设置时它会抛出 System.Configuration.ConfigurationErrorsException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 2014-06-10
      • 2015-10-14
      • 1970-01-01
      • 2021-06-13
      • 2018-12-17
      • 2014-06-26
      相关资源
      最近更新 更多