業務アプリでは、 「設定値を外部ファイルに保存したい」 というニーズが必ず出てきます。 C#では、昔ながらの INIファイル と、 .NET標準の JSON設定ファイル(appsettings.json) の2つがよく使われます。
この記事でわかること
・INIファイルの読み書き(Win32 API / ライブラリ)
・JSON設定ファイル(appsettings.json)の扱い方
・設定クラスへのバインド
・自動保存・自動読み込み
・WPF/WinFormsでの設定管理
・業務アプリ向けベストプラクティス
・INIファイルの読み書き(Win32 API / ライブラリ)
・JSON設定ファイル(appsettings.json)の扱い方
・設定クラスへのバインド
・自動保存・自動読み込み
・WPF/WinFormsでの設定管理
・業務アプリ向けベストプラクティス
1. INIファイルとJSON設定の違い
| 項目 | INI | JSON |
|---|---|---|
| 形式 | 古典的・シンプル | 構造化・階層化 |
| 読みやすさ | ◎ | ○ |
| 複雑な設定 | △ | ◎ |
| 標準サポート | なし(Win32 API) | あり(Configuration API) |
| 用途 | 小規模設定・レガシー互換 | 業務アプリ全般 |
軽い設定 → INI アプリ全体の設定 → JSON(appsettings.json)
2. INIファイルを扱う(Win32 API)
INIは Windows の Win32 API を使って読み書きできます。
■ 2-1. INI読み書きクラス
using System.Runtime.InteropServices;
using System.Text;
public class IniFile
{
private readonly string _path;
public IniFile(string path) => _path = path;
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern int GetPrivateProfileString(
string section, string key, string defaultValue,
StringBuilder retVal, int size, string filePath);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern long WritePrivateProfileString(
string section, string key, string value, string filePath);
public string? Read(string section, string key)
{
var sb = new StringBuilder(1024);
GetPrivateProfileString(section, key, "", sb, sb.Capacity, _path);
return sb.ToString();
}
public void Write(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, _path);
}
}
■ 2-2. INIの読み書き例
var ini = new IniFile("config.ini");
ini.Write("App", "UserName", "Taro");
string? name = ini.Read("App", "UserName");
■ 2-3. INIファイル例
[App]
UserName=Taro
WindowWidth=1280
WindowHeight=720
小規模設定ならINIはとても扱いやすいです。
3. JSON設定ファイル(appsettings.json)を扱う
.NET では JSON 設定が標準でサポートされており、 Configuration API を使うと簡単に扱えます。
■ 3-1. appsettings.json
{
"App": {
"UserName": "Taro",
"Window": {
"Width": 1280,
"Height": 720
}
}
}
■ 3-2. 設定クラスを作る
public class AppSettings
{
public string UserName { get; set; } = "";
public WindowSettings Window { get; set; } = new();
}
public class WindowSettings
{
public int Width { get; set; }
public int Height { get; set; }
}
■ 3-3. 設定を読み込む(.NET 6+)
using Microsoft.Extensions.Configuration;
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var settings = config.GetSection("App").Get<AppSettings>();
reloadOnChange: true にすると、ファイル変更時に自動で再読み込みされます。
4. 設定の自動保存(JSON)
ユーザーが設定を変更したら、自動で保存したいケースがあります。
■ 4-1. 設定を保存するメソッド
public static void SaveSettings(AppSettings settings)
{
var json = JsonSerializer.Serialize(settings, new JsonSerializerOptions
{
WriteIndented = true
});
File.WriteAllText("appsettings.json", json);
}
■ 4-2. 設定変更 → 保存
settings.UserName = "Hanako";
SaveSettings(settings);
WPFなら ViewModel の PropertyChanged で保存するのもアリです。
5. WPF/WinFormsでの設定管理
■ 5-1. 起動時に読み込み
var settings = LoadSettings();
MainWindow.Width = settings.Window.Width;
MainWindow.Height = settings.Window.Height;
■ 5-2. 終了時に保存
settings.Window.Width = (int)MainWindow.Width;
settings.Window.Height = (int)MainWindow.Height;
SaveSettings(settings);
ウィンドウ位置・サイズの保存は業務アプリでよく使われます。
6. DI(依存性注入)と設定の組み合わせ
ASP.NET Core と同じように、 WPF/WinForms でも設定を DI に登録できます。
■ 6-1. DI登録
builder.Services.Configure<AppSettings>(
config.GetSection("App"));
■ 6-2. コンストラクタで受け取る
public class MainViewModel
{
public MainViewModel(IOptions<AppSettings> options)
{
var settings = options.Value;
UserName = settings.UserName;
}
}
設定を ViewModel やサービス層に安全に渡せます。
7. 業務アプリ向けベストプラクティス
- 小規模設定 → INI(軽い・読みやすい)
- アプリ全体の設定 → JSON(標準APIが強力)
- 設定クラスを作り、型安全に扱う
- 自動保存(JSON)でユーザー設定を保持
- DIに設定を登録してアプリ全体で共有
- 設定ファイルはユーザー書き込み可能なフォルダに置く
まとめ:INIとJSONを使い分けると“設定管理が圧倒的に楽になる”
- INI → シンプル・軽量・レガシー互換
- JSON → 標準API・階層構造・自動再読み込み
- 設定クラス+DIで長期運用に強い設計になる
「設定を外部ファイルに保存したい」「ユーザー設定を保持したい」 という現場のニーズに対して、 INI と JSON は最も実務的な解決策です。 この記事をベースに、あなたのアプリに最適な設定管理を設計してみてください。