1

從多種來源(包括stackOverlflow)花絮,但是當我來使用它,我得到以下錯誤消息實現自定義配置節處理程序

「的配置屬性‘DeviceConfig軟件’可以不被自ConfigurationSection衍生「。

我一直在爲這一天的大部分時間而苦苦掙扎,而且我也沒有接近解決方案,所以對此事的任何幫助都將不勝感激。我在實現自定義配置部分是新手,所以請溫柔地對待我:-)

App.config文件看起來是這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="deviceconfig" type="CNIMonitor.Core.CustomConfig.DeviceConfig,Core"/> 
    </configSections> 
<system.diagnostics> 
    <sources> 
     <!-- This section defines the logging configuration for My.Application.Log --> 
     <source name="DefaultSource" switchName="DefaultSwitch"> 
      <listeners> 
       <add name="FileLog"/> 
       <!-- Uncomment the below section to write to the Application Event Log --> 
       <!--<add name="EventLog"/>--> 
      </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="DefaultSwitch" value="Information" /> 
    </switches> 
    <sharedListeners> 
     <add name="FileLog" 
      type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
      initializeData="FileLogWriter"/> 
     <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log --> 
     <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> --> 
    </sharedListeners> 
</system.diagnostics> 
<deviceconfig> 
    <devices>   
     <device deviceid = "1" 
       name = "localhost" 
       ipaddress="127.0.0.1" 
       port="10000" 
       status="not listening" 
       message="no message" 
     /> 
     <device deviceid ="2" 
       name ="2nd localhost" 
       ipaddress="127.0.0.1" 
       port="20000" 
       status="not listening" 
       message="no message" 
     /> 
    </devices> 
</deviceconfig> 

自定義節處理程序代碼如下:

Imports System.Configuration 

命名空間CNIMonitor.Core.CustomConfig

Public Class DeviceConfig 
    Inherits ConfigurationSection 
    <ConfigurationProperty("deviceconfig")> _ 
    Public ReadOnly Property DeviceConfig() As DeviceConfig 
     Get 
      Return CType(MyBase.Item("deviceconfig"), DeviceConfig) 
     End Get 
    End Property 
End Class 

<ConfigurationCollectionAttribute(GetType(Device))> _ 
Public Class Devices 
    Inherits ConfigurationElementCollection 
    Protected Overrides Function CreateNewElement() As ConfigurationElement 
     Return New Device 
    End Function 
    Protected Overrides Function GetElementKey _ 
    (ByVal element As ConfigurationElement) As Object 
     Return CType(element, Device).DeviceID 
    End Function 
    Public Sub Add(ByVal element As Device) 
     Me.BaseAdd(element) 
    End Sub 
End Class 
Public Class Device 
    Inherits ConfigurationElement 
    <ConfigurationProperty("deviceid", DefaultValue:="", IsKey:=True, IsRequired:=True)> _ 
    Public Property DeviceID() As String 
     Get 
      Return CType(MyBase.Item("deviceid"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("deviceid") = value 
     End Set 
    End Property 
    <ConfigurationProperty("hostname", DefaultValue:="", IsKey:=True, IsRequired:=False)> _ 
    Public Property HostName() As String 
     Get 
      Return CType(MyBase.Item("RegisteredDate"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("RegisteredDate") = value 
     End Set 
    End Property 
    <ConfigurationProperty("ipaddress", DefaultValue:="", IsKey:=True, IsRequired:=False)> _ 
    Public Property IpAddress() As String 
     Get 
      Return CType(MyBase.Item("ipaddress"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("ipaddress") = value 
     End Set 
    End Property 
    <ConfigurationProperty("port", DefaultValue:="", IsKey:=True, IsRequired:=False)> _ 
    Public Property Port() As String 
     Get 
      Return CType(MyBase.Item("port"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("port") = value 
     End Set 
    End Property 
    <ConfigurationProperty("status", DefaultValue:="", IsKey:=False, IsRequired:=False)> _ 
    Public Property Status() As String 
     Get 
      Return CType(MyBase.Item("status"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("status") = value 
     End Set 
    End Property 
    <ConfigurationProperty("message", DefaultValue:="", IsKey:=False, IsRequired:=False)> _ 
    Public Property Message() As String 
     Get 
      Return CType(MyBase.Item("message"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("message") = value 
     End Set 
    End Property 
End Class 

End Namespace 

回答

1

頂層不需要DeviceConfig屬性。 需要做的是爲您的ConfigurationElementCollection設備添加一個屬性。我還會將你的Devices類重命名爲不太模糊的東西,比如DeviceElementCollection。試試這個:

Public Class DeviceConfig  
    Inherits ConfigurationSection  

    <ConfigurationProperty("Devices")> _  
    Public ReadOnly Property Devices() As DeviceElementCollection  
     Get  
      Return CType(Me("Devices"), DeviceElementCollection)  
     End Get  
    End Property  
End Class  

然後,在你定義DeviceElementCollection,你可能有問題,如果不添加以下內容:

Public Overrides ReadOnly Property CollectionType() As System.Configuration.ConfigurationElementCollectionType 
    Get 
     Return ConfigurationElementCollectionType.BasicMap 
    End Get 
End Property 

Protected Overrides ReadOnly Property ElementName() As String 
    Get 
     Return "Device" 
    End Get 
End Property 

我寫了一個很長的回答類似的問題(對不起,在C#)here

更新 - 如何在代碼中使用

Dim deviceConfiguration as DeviceConfig = ConfigurationManager.GetSection("deviceconfigs") 
For Each device As Device in deviceConfiguration.Devices 
    '...whatever you need to do 
Next 
+0

AJ感謝您的repsonse,已經改變了我的代碼按你的建議,現在該代碼編譯,但我在一個不知如何使用來自應用程序內的部分處理程序。你有什麼建議嗎?我需要找到一個方法來遍歷配置文件中指定的元素集合。 – 2010-11-03 10:11:10

+0

查看我的使用更新。 – 2010-11-03 15:29:28

+0

有點深入的調查得到它的工作 – 2010-11-03 16:57:01