【実務・中級編】VB.NETアプリケーションの設定管理:App.configとMy.Settingsを使い分ける実務的アプローチ – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

VB.NET設定管理の極意:App.configとMy.Settingsを使いこなし、堅牢なアプリを構築せよ

現場で「とりあえず動くコード」を書くエンジニアは多い。だが、「環境が変わっても、ユーザーが設定をいじっても、絶対に壊れないコード」を書ける者は一握りだ。

VB.NETにおける設定管理は、単なるデータの保存場所選びではない。アプリケーションのライフサイクルと、メモリへの影響を深く理解した上での「戦略」だ。今回は、多くの者が曖昧に使い分け、後に技術負債として積み上がる`App.config`と`My.Settings`の境界線を明確にする。

1. なぜ「設定管理」で多くのプロジェクトが破綻するのか

開発者が陥る最大の罠は、「すべての設定をApp.configに書き込むこと」、あるいは「My.Settingsを安易に使いすぎて値を破壊すること」だ。

  • App.config (読み取り専用の聖域): コンパイル時に`App.exe.config`として出力される。これは「アプリの挙動の前提条件(接続先DBのURLなど)」を記述する場所だ。
  • My.Settings (ユーザーの生活空間): ユーザーごとの画面位置や、最後の入力履歴など「可変的な状態」を保持する場所だ。

この境界線を無視し、App.configにユーザーの操作履歴を書き込もうとするな。それは権限エラーと設定の整合性喪失を招く自殺行為だ。

2. 【原則】App.configは「静的インフラ」、My.Settingsは「動的パーソナライズ」

App.config:環境依存の定数

DBの接続文字列やAPIのタイムアウト値など、開発者が環境ごとに差し替えるべき値はここに置く。実行中にプログラム側から上書きすることは推奨しない。

.net
‘ App.configから接続文字列を読み取るベストプラクティス
‘ ConfigurationManagerを参照設定に追加すること
Imports System.Configuration

Public Function GetConnectionString() As String
‘ 設定がない場合のガード節を入れるのがプロの作法
Dim connString As String = ConfigurationManager.ConnectionStrings(“MainDB”)?.ConnectionString

If String.IsNullOrEmpty(connString) Then
Throw New InvalidOperationException(“App.configに接続文字列が見当たりません。”)
End If

Return connString
End Function

My.Settings:ユーザーごとの状態管理

画面のサイズやログインIDの記憶など、ユーザーが操作するたびに変化する値を扱う。これらは内部的に`user.config`としてAppData配下に保存される。

3. 実践:保守性を最大化する「ラッパー」設計

My.Settingsを直接コードに埋め込むと、設定名が変わった瞬間にコンパイルエラーの嵐となる。これを防ぐために、設定を管理する「プロキシクラス」を一枚噛ませるのが、堅牢な設計の要だ。

.net
”’

”’ アプリケーション設定を抽象化するラッパー
”’

Public NotInheritable Class AppSettingsWrapper
‘ シングルトン化してアクセスを一本化する
Private Shared ReadOnly _instance As New AppSettingsWrapper()
Public Shared ReadOnly Property Instance As AppSettingsWrapper = _instance

‘ 設定値の読み込み(My.Settingsを直接参照させない)
Public Property LastUserName As String
Get
Return My.Settings.LastUserName
End Get
Set(value As String)
My.Settings.LastUserName = value
‘ 即時保存を強制するか、終了時にまとめて保存するかは要件次第
My.Settings.Save()
End Set
End Property
End Class

4. 現場で必ず直面する「落とし穴」への対策

1. バージョンアップ時の設定引き継ぎ

アプリケーションのバージョンを上げた際、`user.config`のパスが変わることで設定がリセットされることがある。これを防ぐには、アプリ起動時に以下の処理を一行入れる。

.net
‘ Form_LoadまたはMainメソッドで実行
If My.Settings.IsUpgradeRequired Then
My.Settings.Upgrade()
My.Settings.IsUpgradeRequired = False
My.Settings.Save()
End If

2. 書き込み権限の壁

App.configをプログラムから書き換えようとすれば、UAC(ユーザーアカウント制御)に阻まれるか、仮想化フォルダに書き込まれて悲惨な結果になる。「設定ファイルは実行ファイルと同じ場所にあるとは限らない」という事実を忘れてはならない。

結論:エンジニアの美学

優れた設定管理とは、「何も考えずにコードを書いても、不整合が起きない仕組み」を作ることだ。

  • App.configは、配備担当者が触る「環境定義書」として守る。
  • My.Settingsは、ユーザーの利便性のための「動的状態」として扱う。
  • ラッパー層を一枚挟むことで、将来的な設定仕様の変更をコードの奥深くまで浸透させない。

これらを徹底すれば、あなたの書くツールはリリース後も誰にも文句を言わせない、堅牢で美しいプロダクトへと昇華するはずだ。次のビルドから、ぜひこの思想を取り入れてみてほしい。

タイトルとURLをコピーしました