2012-02-02 13 views
3

更新:私は以下の質問をしましたが、実際には私の問題は若干異なる質問をして解決します。なぜ、いくつかのマシン上で自分のアプリケーションがエラーをスローしません:それはない他のマシン上のよう配備後に設定ファイルに<configSections>がありません

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> 

一部の背景。私は、2007年と2010年のOutlook 2007を実行しているマシン7台でクリック一度のビジュアルスタジオインストーラを使ってアドインを展開しています。

アドインは、exeとは異なりapp.configファイルに読み書きしますローカルユーザのappdataフォルダに格納されます。

一部のマシンでは、「構成システムの初期化に失敗しました - System.Configuration - System.Configuration.ConfigurationManager.PrepareConfigSystem()」のエラー 私のケースで上記の欠落した要素が原因ですXML。しかし、他のマシンでは、configSectionsは欠けていません。この問題は、使用されているOutlookのバージョンとは無関係です。

+0

:私は、ローミングディレクトリ内の設定ファイルに固定され、「.dll.config」ファイルから(それが欠けている場合)をコピー欠落しているXMLの一部機能を作りました私は今日もこの問題に直面しました。あなたは解決策を見つけましたか? – BLSully

+0

@BLSully:私は以下のソリューションを掲載しました... – jreichert

答えて

1

私は昨日私のVSTO DLLプロジェクトで同じ問題を抱えていましたが、なぜwith name = "userSettings"が時々見つからないのかの理由は分かりません。 しかし、私は私の解決策を提供することができます。

/// <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); 
    } 
関連する問題