構成ファイルのカスタム構成セクションにデータを設定する

カスタム構成セクションのデータを取得するという記事はネットでいろいろ公開されてるようですが、設定する記事がないようです。そこで少しチャレンジしてみました。

「いつものパン」があなたを殺す: 脳を一生、老化させない食事 (単行本)

「いつものパン」があなたを殺す: 脳を一生、老化させない食事 (単行本)


参考記事


本エントリーの流れは、以下のとおりです。

  • ConfigurationSection 派生クラスを作成
  • 構成ファイルにカスタム構成セクションを追加
  • Configuration のインスタンスを生成
  • カスタム構成セクションのデータを読み込む
  • カスタム構成セクションにデータを設定する

ConfigurationSection 派生クラスを作成

まず System.Configuration.ConfigurationSection から派生したクラスを作成します。なおこの記事ではめんどくさいので Element にはデータを設定しません。属性のみデータを設定してます。

''' <summary>
''' ログイン用カスタム構成セクションクラス
''' </summary>
''' <remarks>構成ファイルのカスタム構成セクションに保存されたログイン情報を取得・設定します。remarks>
Public Class LoginSection
    Inherits ConfigurationSection

        ''' <summary>
        ''' 会社コードを取得・設定します。
        ''' </summary>
        <ConfigurationProperty("Division", DefaultValue:="")> _
        <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=0, MaxLength:=20)> _
        Public Property Division() As String
                Get
                        Return CStr(Me("Division"))
                End Get
                Set(ByVal value As String)
                        Me("Division") = value
                End Set
        End Property

        ''' <summary>
        ''' ユーザーID を取得・設定します。
        ''' </summary>
        <ConfigurationProperty("UserId", DefaultValue:="")> _
        <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=0, MaxLength:=20)> _
        Public Property UserId() As String
                Get
                        Return CStr(Me("UserId"))
                End Get
                Set(ByVal value As String)
                        Me("UserId") = value
                End Set
        End Property

End Class

app.config にカスタム構成セクションを追加

お次は、app.config にカスタム構成セクションを追加します。構成セクション追加する際に判らなかったのが、section 要素の type 属性 の設定。これは呼び出すクラスとアセンブリを指定するようですね。

type="厳密なクラス名,厳密なアセンブリ名,バージョン,カルチャー,公開キー・トークン"

の順で指定するようです。

MSDN の記事 「ConfigurationSection を使用してカスタム構成セクションを作成する」 には「アセンブリマニフェストに一致する必要があります」と書かかれてますね。

<configuration>
        <configSections>
                <section name="LoginSection"
                         type="hogeApp.Security.LoginSection, 
                               hogeApp.Security, 
                               Version=1.0.0.0, 
                               Culture=neutral, 
                               PublicKeyToken=null"/>
        </configSections>
        ・・・・・・
        <LoginSection Division="hilapon" UserId="hilapon"/>
        ・・・・・・
</configuration>

System.Configuration.Configuration のインスタンスを生成する

ここまで準備ができたところで、お次は System.Configuration.Configurationインスタンスを生成します。この辺りは以下の記事を参考にさせて頂きました。

web.config / app.config の applicationSettingsの値を更新する方法


Configuration クラスのインスタンスを生成します。ここで味噌になるのが、ExeConfigurationFileMapインスタンスを生成して構成ファイル名を設定してやること。次に ConfigurationManager.OpenMappedExeConfiguration メソッドのパラメータに ExeConfigurationFileMap と ConfigurationUserLevel を指定して、Configuration のオブジェクトを取得します。本エントリーでは ConfigurationUserLevel.None にしてますが、状況によりローカルユーザーやローミングユーザーの指定が必要になるかもしれません。

        Dim configFile As New ExeConfigurationFileMap()
        configFile.ExeConfigFilename = "hogehogeApp.exe.config"
        Dim config As Configuration = _
                ConfigurationManager.OpenMappedExeConfiguration(configFile, ConfigurationUserLevel.None)

カスタム構成セクションのデータを読み込む

Configuration.GetSection メソッドで ConfigurationSection 派生クラスのオブジェクトを生成、後はプロパティにアクセスすれば、設定された属性値を取得できます。

        Dim section As LoginSection = CType(config.GetSection("LoginSection"), LoginSection)
        Me.TextCompanyCode.Text = section.Division
        Me.TextUserId.Text = section.UserId

カスタム構成セクションにデータを設定する

Configuration.GetSection メソッドで ConfigurationSection 派生クラスのオブジェクトを生成、プロパティにデータを設定して、Configuration.Save メソッドでカスタム構成セクションに保存できます。この記事では ConfigurationSaveMode.Full にしてますが、安全性を考慮するなら ConfigurationSaveMode.Modified にしといた方がいいかもしれません。

        Dim section As LoginSection = CType(config.GetSection("LoginSection"), LoginSection)
        section.Division = Me.TextCompanyCode.Text
        section.UserId = Me.TextUserId.Text
        config.Save(ConfigurationSaveMode.Full)