構成ファイルのカスタム構成セクションにデータを設定する
カスタム構成セクションのデータを取得するという記事はネットでいろいろ公開されてるようですが、設定する記事がないようです。そこで少しチャレンジしてみました。
「いつものパン」があなたを殺す: 脳を一生、老化させない食事 (単行本)
- 作者: デイビッドパールマター,クリスティンロバーグ,David Perlmutter,Kristin Loberg,白澤卓二
- 出版社/メーカー: 三笠書房
- 発売日: 2015/01/16
- メディア: ハードカバー
- この商品を含むブログ (12件) を見る
参考記事
- 方法 : ConfigurationSection を使用してカスタム構成セクションを作成する
- アプリケーション構成ファイル(App.config)、Web構成ファイル(Web.config)にカスタム構成セクションを追加する
- web.config / app.config の applicationSettingsの値を更新する方法
本エントリーの流れは、以下のとおりです。
- 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 属性 の設定。これは呼び出すクラスとアセンブリを指定するようですね。
の順で指定するようです。
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)