C#でiniファイルを読み込む方法です。超簡単です。
Win32 APIのGetPrivateProfileString関数とGetPrivateProfileInt関数を使って、iniファイルを読み込みます。
iniファイルを読み込む方法
C#におけるiniファイル読み込みは、Win32 APIが必要になります。Win32 APIというのは、Windowsが提供しているAPIのことです。簡単に説明すると、自分で作ったアプリから、WindowsのOSを直接操作しますよ、ということです。
そこに用意されている、
- GetPrivateProfileString関数
- GetPrivateProfileInt関数
を使えば、iniファイルから値を取得できます。
準備
GetPrivateProfileString関数とGetPrivateProfileInt関数を使うためには準備が必要です。
準備と言っても、OS側で何か操作が必要と言うわけではありません。ソースコードに以下を記述します。
//iniファイル読み込みに必要
using System.Runtime.InteropServices;
namespace CS_Get_Ini
{
public partial class Form_CS_Get_Ini : Form
{
//---DLL関数の定義 START---//
//GetPrivateProfileString関数の定義
[DllImport("KERNEL32.DLL")]
public static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);
//GetPrivateProfileInt関数の定義
[DllImport("KERNEL32.DLL")]
public static extern uint GetPrivateProfileInt(
string lpAppName,
string lpKeyName,
int nDefault,
string lpFileName);
//---DLL関数の定義 END ---//
public Form_CS_Get_Ini()
{
InitializeComponent();
}
}
}
上記の太字にした部分が必要となります。
「[DllImport(“KERNEL32.DLL”)]」とか「extern uint」みたいな見慣れない文字が並んでいると思いますが、とりあえずiniファイルの値を取得したい方は何も考えずに、太字の部分をコピペしてみて下さい。
「using System.Runtime.InteropServices;」は、namespace の外側に記述(上でOK)、DLL関数の定義部分はクラス内に記述します(メソッド内に記述はダメ)。
というわけで、確認用に簡単な画面を作成しました。

左側はGetPrivateProfileString関数用、右側はGetPrivateProfileInt関数用です。
仕様はとても簡単で、
- 上のテキストボックスにiniファイルのパスを入力
- 実行ボタンを押下
- 下のテキストボックスにiniファイルから取得した値を表示
というものです。
GetPrivateProfileString関数
まず、GetPrivateProfileString関数の使い方です。
GetPrivateProfileString関数はiniファイルの情報を文字列として取得します。厳密に言えば、取得する際にStringBuilder型の変数に格納されるので、文字列として扱う場合はToStringする必要があります。
実際にiniファイルを用意しました。

今回は2行目に記述している「OutPutPath」の値を取得してみます。サンプルコードはこちらです。
//iniファイル読み込みに必要
using System.Runtime.InteropServices;
namespace CS_Get_Ini
{
public partial class Form_CS_Get_Ini : Form
{
// DLL関数の定義です。
//GetPrivateProfileString関数の宣言
[DllImport("KERNEL32.DLL")]
public static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);
public Form_CS_Get_Ini()
{
InitializeComponent();
}
private void cmdGetIniStr_Click(object sender, EventArgs e)
{
txtResultStr.Text = MyGetPrivateProfileString();
}
//GetPrivateProfileString関数用のメソッド
private string MyGetPrivateProfileString()
{
//変数宣言
string strSection = "LOGFILE"; //Iniファイルのセクション
string strKye = "OutPutPath"; //Iniファイルのキー
string strDefault = "Iniファイルの値がありません。"; //値が取得できなかった場合の初期値
StringBuilder sbResult = new StringBuilder(1024); //取得値を格納する変数
string strFilePath = txtFilePathStr.Text; //Iniファイルのパス
//Iniファイル情報取得
GetPrivateProfileString(strSection
, strKye
, strDefault
, sbResult
, Convert.ToUInt32(sbResult.Capacity)
, strFilePath);
return sbResult.ToString();
}
}
}
DLL定義も一緒に記述しておきました。実際に実行してみます。iniファイルのパスを入力して、実行ボタンをクリックします。

実行結果はこちら。

「OutPutPath」の値である「D:\CS\Log\」を取得できています。
サンプルコード内のコメントにも書いてますが、GetPrivateProfileString関数の引数は次のようになっています。
- 第1引数:セクション名 … [] で囲まれている部分
- 第2引数:キー名 … イコール(=)の左側
- 第3引数:初期値 … iniファイルから値が取得できなかった場合の値
- 第4引数:許容範囲 … とりあえず「Convert.ToUInt32(StringBuilderの変数名.Capacity)」って書いておけばOK
- 第5引数:iniファイルのフルパス
これらの引数を、ご自身の環境に合わせて記述して、実行してみて下さい。
GetPrivateProfileInt関数
次に、GetPrivateProfileInt関数の使い方です。
GetPrivateProfileInt関数はiniファイルの情報を数値として取得します。取得後にキャストする必要があるので、少し工夫します。
実際にiniファイルを用意しました。

今回は7行目に記述している「ValueNum」の値を取得してみます。サンプルコードはこちらです。
//iniファイル読み込みに必要
using System.Runtime.InteropServices;
namespace CS_Get_Ini
{
public partial class Form_CS_Get_Ini : Form
{
//GetPrivateProfileInt関数の宣言
[DllImport("KERNEL32.DLL")]
public static extern uint GetPrivateProfileInt(
string lpAppName,
string lpKeyName,
int nDefault,
string lpFileName);
public Form_CS_Get_Ini()
{
InitializeComponent();
}
private void cmdGetIniInt_Click(object sender, EventArgs e)
{
txtResultInt.Text = MyGetPrivateProfileInt().ToString(); //【注意】テキストボックスに表示するためにToStringしている。
}
//GetPrivateProfileInt関数用のメソッド
private int MyGetPrivateProfileInt()
{
//変数宣言
string strSection = "VALUE"; //Iniファイルのセクション
string strKye = "ValueNum"; //Iniファイルのキー
int intDefault = 0; //値が取得できなかった場合の初期値
string strFilePath = txtFilePathInt.Text; //Iniファイルのパス
int intRet; //このメソッドの戻り値用
//キャストして変数に格納
intRet=(int)GetPrivateProfileInt(strSection
, strKye
, intDefault
, strFilePath);
return intRet;
}
}
}
これを実際に実行してみましょう。iniファイルのパスを入力して、実行ボタンをクリックします。

実行結果はこちら。

「ValueNum」の値である「1000」を取得できています。
サンプルコード内のコメントにも書いてますが、GetPrivateProfileInt関数の引数は次のようになっています。
- 第1引数:セクション名 … [] で囲まれている部分
- 第2引数:キー名 … イコール(=)の右側
- 第3引数:初期値 … iniファイルから値が取得できなかった場合の値
- 第4引数:iniファイルのパス
ここで肝なのが、GetPrivateProfileInt関数を実際に実行する部分。サンプルコード上では次の様に記載しています。
//キャストして変数に格納
intRet=(int)GetPrivateProfileInt(strSection
, strKye
, intDefault
, strFilePath);
可視化のため、明示的に戻り値用のint型変数 intRet を用意しています。
戻り値用の intRet にGetPrivateProfileInt関数の戻り値をそのまま代入するコードを書くとコンパイルエラーとなるので、GetPrivateProfileInt関数の戻り値をint型でキャストしてあげて下さい。
参考サイト
API インデックス – Win32 apps | Microsoft Docs
DllImportAttribute クラス (System.Runtime.InteropServices) | Microsoft Docs
.
