2016-06-28 62 views
1

我正在製作一個應用程序,需要爲其設置讀取其配置文件。ConfigurationManager立即給出TypeInitializationException

我在APP_CONFIG文件中定義的設置,像這樣:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="sswcomm" type="SSWAgent.SSWConfig" /> 
    <section name="folders" type="SSWAgent.SSWConfigFolderCollection" /> 
    <section name="folder" type="SSWAgent.SSWConfigFolderElement" /> 
    </configSections> 
    <sswcomm id="SC_SSWTEST1" connectionInterval="5000"> 
    <folders> 
     <folder id="OUTGOINGATOTEST2" enable="true" includeSubFolders="true" fromPath="C:\temp\a\NET\Outgoing_A" wildcard="*.*" recipientId="C_SSWTEST2" /> 
     <folder id="OUTGOINGBTOTEST3" enable="true" includeSubFolders="true" fromPath="C:\temp\a\NET\Outgoing_B" wildcard="*.*" recipientId="C_SSWTEST3" /> 
    </folders> 
    </sswcomm> 
</configuration> 

而像這樣的C#代碼:

public sealed class SSWConfig : ConfigurationSection 
    { 
     private static SSWConfig settings = ConfigurationManager.GetSection("sswcomm") as SSWConfig; 

     public static SSWConfig Settings 
     { 
      get { return settings; } 
     } 

     [ConfigurationProperty("id", DefaultValue = "", IsKey = true, IsRequired = true)] 
     [StringValidator(InvalidCharacters = " [email protected]#$%^&*()[]{}/;’\"|\\", MinLength = 1, MaxLength = 256)] 
     public string Id 
     { 
      get { return (string)this["id"]; } 
      set { this["id"] = value; } 
     } 

     [ConfigurationProperty("connectionInterval", DefaultValue = "", IsKey = true, IsRequired = true)] 
     public int ConnectionInterval 
     { 
      get { return (int)this["connectionInterval"]; } 
      set { this["connectionInterval"] = value; } 
     } 

     [ConfigurationProperty("folders", IsDefaultCollection = true, IsKey = false, IsRequired = true)] 
     public SSWConfigFolderCollection Folders 
     { 
      get { return base["folders"] as SSWConfigFolderCollection; } 
     } 

    } 

    public sealed class SSWConfigFolderCollection : ConfigurationElementCollection 
    { 
     protected override ConfigurationElement CreateNewElement() 
     { 
      return new SSWConfigFolderElement(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      return ((SSWConfigFolderElement)element).Id; 
     } 

     new public SSWConfigFolderElement this[string Id] 
     { 
      get { return (SSWConfigFolderElement)base.BaseGet(Id); } 
     } 

     public override ConfigurationElementCollectionType CollectionType 
     { 
      get 
      { 
       return ConfigurationElementCollectionType.BasicMap; 
      } 
     } 

     public SSWConfigFolderElement this[int index] 
     { 
      get { return (SSWConfigFolderElement)base.BaseGet(index); } 
     } 

     protected override string ElementName 
     { 
      get 
      { 
       return "folder"; 
      } 
     } 
    } 

    public sealed class SSWConfigFolderElement : ConfigurationElement 
    { 
     [ConfigurationProperty("id", DefaultValue = "", IsKey = true, IsRequired = true)] 
     [StringValidator(InvalidCharacters = " [email protected]#$%^&*()[]{}/;’\"|\\", MinLength = 1, MaxLength = 256)] 
     public string Id 
     { 
      get { return (string)base["id"]; } 
      set { base["id"] = value; } 
     } 

     [ConfigurationProperty("enable", DefaultValue = "true", IsKey = false, IsRequired = true)] 
     public bool Enable 
     { 
      get { return (string)base["enable"] == "true"; } 
      set { if (value) { base["enable"] = "true"; } else { base["enable"] = "false"; } } 
     } 

     [ConfigurationProperty("includeSubFolders", DefaultValue = "true", IsKey = false, IsRequired = true)] 
     public bool IncludeSubFolders 
     { 
      get { return (string)base["includeSubFolders"] == "true"; } 
      set { if (value) { base["includeSubFolders"] = "true"; } else { base["enable"] = "false"; } } 
     } 

     [ConfigurationProperty("fromPath", DefaultValue = "", IsKey = false, IsRequired = true)] 
     public string FromPath 
     { 
      get { return (string)base["fromPath"]; } 
      set { base["fromPath"] = value; } 
     } 

     [ConfigurationProperty("wildcard", DefaultValue = "*.*", IsKey = false, IsRequired = true)] 
     public string Wildcard 
     { 
      get { return (string)base["wildcard"]; } 
      set { base["wildcard"] = value; } 
     } 

     [ConfigurationProperty("recipientId", DefaultValue = "", IsKey = false, IsRequired = true)] 
     [StringValidator(InvalidCharacters = " [email protected]#$%^&*()[]{}/;’\"|\\", MinLength = 1, MaxLength = 256)] 
     public string RecipientId 
     { 
      get { return (string)base["recipientId"]; } 
      set { base["recipientId"] = value; } 
     } 
    } 

現在,每當我打電話SSWConfig放它在一個變量中,我立即得到一個TypeInitializationException異常。我想因爲GetSection部分返回null。這是因爲我在App.config文件中犯了一個錯誤?

帶有嵌套元素的app.config對我來說是新的,所以它可能是我定義它是錯誤的。

回答

0

只需發佈我的解決方案。

顯然我讓它比實際上更難。我從頭開始,經過一些修改後,我的設置被讀取。

我的另一個錯誤是我從來沒有真正讀過配置文件(oops),認爲它會在調用Configuration類時自動發生。

類:

// <sswcomm></sswcomm> settings 
public class SSWConfigSSWComm : ConfigurationSection 
{ 
    [ConfigurationProperty("id")] 
    public string Id 
    { 
     get { return (string)this["id"]; } 
     set { this["id"] = value; } 
    } 

    [ConfigurationProperty("connectionInterval")] 
    public int ConnectionInterval 
    { 
     get { return (int)this["connectionInterval"]; } 
     set { this["connectionInterval"] = value; } 
    } 

    [ConfigurationProperty("toPath")] 
    public string ToPath 
    { 
     get { return (string)this["toPath"]; } 
     set { this["toPath"] = value; } 
    } 

    [ConfigurationProperty("folders")] 
    [ConfigurationCollection(typeof(SSWConfigFolderElement), AddItemName = "folder")] 
    public SSWConfigFolderElementCollection sswConfigFolders 
    { 
     get { return (SSWConfigFolderElementCollection)base["folders"]; } 
    } 
} 

// <folder> settings 
[ConfigurationCollection(typeof(SSWConfigFolderElement))] 
public class SSWConfigFolderElementCollection : ConfigurationElementCollection 
{ 
    new public SSWConfigFolderElement this[string name] 
    { 
     get { return (SSWConfigFolderElement)base.BaseGet(name); } 
    } 

    public SSWConfigFolderElement this[int index] 
    { 
     get { return (SSWConfigFolderElement)base.BaseGet(index); } 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new SSWConfigFolderElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((SSWConfigFolderElement)element).Id; 
    } 
} 

public class SSWConfigFolderElement : ConfigurationElement 
{ 
    [ConfigurationProperty("id")] 
    public string Id 
    { 
     get { return (string)base["id"]; } 
     set { base["id"] = value; } 
    } 

    [ConfigurationProperty("enable")] 
    public bool Enable 
    { 
     get { return (string)base["enable"] == "true"; } 
     set { if (value) { base["enable"] = "true"; } else { base["enable"] = "false"; } } 
    } 

    [ConfigurationProperty("includeSubFolders")] 
    public bool IncludeSubFolders 
    { 
     get { return (string)base["includeSubFolders"] == "true"; } 
     set { if (value) { base["includeSubFolders"] = "true"; } else { base["enable"] = "false"; } } 
    } 

    [ConfigurationProperty("fromPath")] 
    public string FromPath 
    { 
     get { return (string)base["fromPath"]; } 
     set { base["fromPath"] = value; } 
    } 

    [ConfigurationProperty("wildcard")] 
    public string Wildcard 
    { 
     get { return (string)base["wildcard"]; } 
     set { base["wildcard"] = value; } 
    } 

    [ConfigurationProperty("recipientId")] 
    [StringValidator(InvalidCharacters = " [email protected]#$%^&*()[]{}/;’\"|\\", MinLength = 1, MaxLength = 256)] 
    public string RecipientId 
    { 
     get { return (string)base["recipientId"]; } 
     set { base["recipientId"] = value; } 
    } 
} 

收集數據

 Configuration conf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     SSWConfigSSWComm sc = (SSWConfigSSWComm)conf.GetSection("sswcomm"); 

     string Id = sc.Id; 
     long lngInterval = sc.ConnectionInterval; 
     string toPath = sc.ToPath; 
     SSWConfigFolderElementCollection fec = sc.sswConfigFolders; 
     foreach (SSWConfigFolderElement fe in fec) 
     { 
      string fromPath = fe.FromPath; 
      string wildcard = fe.Wildcard; 
      bool includeSubFolders = fe.IncludeSubFolders; 
      string recipientId = fe.RecipientId; 
      sp.GetFiles(Id, recipientId, fromPath, toPath, wildcard, includeSubFolders); 
     } 

希望這將幫助別人的未來。