Click here to Skip to main content
Click here to Skip to main content

INI Class for .NET

, 9 Aug 2005 CC (ASA 2.5)
Rate this:
Please Sign up or sign in to vote.
Class for interfacing with INI files.

Sample Image - aejw_ini_class.jpg


This is a class for reading and adjusting INI files. The class utilizes the WritePrivateProfileString and GetPrivateProfileString API calls. Written mainly for legacy support, as a lot applications still use INI files and although there is XML support native to .NET (".config" files), I tend to find that for some circumstances INI files are straightforward and more practical to use.

Using the code

  • Add the class file "cINI.cs" to your project / solution.
  • Declare and use the class.
    //Read value from INI
    aejw.cIni oIni = new aejw.cIni("C:\\INIFile.ini");
    string sRet = oIni.ReadValue("TheSection", 
                       "TheKey", "DefaultReturn");

Functions / Methods

The following examples require the object / class to be declared.

aejw.cIni oIni = new aejw.cIni("C:\\INIFile.ini");

Read Value

//Read value from INI
string sRet = oIni.ReadValue("TheSection", "TheKey", "");

Write Value

//Write value to INI
oIni.WriteValue("TheSection", "TheKey", "TheValue");

Remove Value

//Remove value from INI
oIni.RemoveValue("TheSection", "TheKey");

Read Sections

//Read sections from INI
Array oSections = new Array[0];
oIni.ReadSections(ref oSections);

Read Values (Value names)

//Read values from INI
Array oValues = new Array[0];
oIni.ReadValues(ref oValues);

About the code

Below is a general breakdown of how the code works...

  • Referring to the API function...

    All the functions at some stage use a API call. By reading the MSDN Platform SDK material, we get the C++ API call and behavior of the API function...

    DWORD GetPrivateProfileString(
        LPCTSTR lpAppName,
        LPCTSTR lpKeyName,
        LPCTSTR lpDefault,
        LPTSTR  lpReturnedString,
        DWORD   nSize,
        LPCTSTR lpFileName

    Which loosely translates to... (I am using the term loosely on the bases that there are multiple ways of handling the parameters.)

    [DllImport("kernel32", SetLastError=true)]
    private static extern int GetPrivateProfileString(
        string pSection,
        string pKey,
        string pDefault,
        byte[] pValue,
        int    pBufferLen,
        string pFile

    Make note of the LPTSTR to byte[] conversion. The LPTSTR refers to a pointer / reference in memory that the API function will write to, we are going to use a framework function later to collect the text.

  • Calling the API function...

    Once the API declaration has been added, we need to create a function to wrap the API function into a C# friendly function.

    private string z_GetString(string psSection, 
                               string psKey, string psDefault){
        //Prepare the default return and create 
        //a byte array to pass as a pointer
        string sRet=psDefault;
        byte[] bRet=new byte[255];
        //Call the API function, passing a Section name, value name, default value,
        //buffer length (length of the passed byte array) and the ini filename.
        int i=GetPrivateProfileString(psSection, psKey, 
                        psDefault, bRet, 255, ls_IniFilename);
        //As referred above we use a framework function 
        //to collect the string from the byte
        //array used as a pointer. Note the 'i' variable 
        //is the return from the API call, this
        //is passed to the text encoding as the total length of the return.
  • Using the function...

    Now that we have a API declaration and friendly function, we can call the function at will...

    string sSetting=z_GetString("SectionName","ValueName","");
    string sSetting2=z_GetString("SectionName2", 


  • 3rd August 2005 - build 0019
    • Wrote some more general documentation.
    • Changed class filename to 'cINI.cs'.
    • Corrected 'ReadSections' and 'ReadValues'. Rewrote 'z_GetString' function to correctly handle the text encoding and accept chr(0). (Thanks to 'yurij' for reporting the bug).
    • General small bug fixes and improvements.
  • 14th April 2005 - build 0018
    • Corrected issue when returning high ASCII characters, e.g.: 'åäö'
    • Tidied class and documents
  • 6th Feb 2004 - build 0016
    • Corrected bug in 'ReadValue', would return 'char(0)' to the length of the buffer after the value returned.
  • 5th Feb 2004 - build 0015
    • First build posted on CodeProject, based on previous code and dubbed 0015.


This article, along with any associated source code and files, is licensed under The Creative Commons Attribution-ShareAlike 2.5 License


About the Author

Web Developer
New Zealand New Zealand
C#, (Web and forms), SQL Server, MySQL, ASP, Win32 API, ...

Comments and Discussions

Questionfirst item of array filled by ReadValues always seems to be an empty string [modified] Pinmemberc_keen12-Mar-12 9:48 
GeneralThanks for the Class PinmemberDecad18-Jul-08 1:34 
GeneralRe: Thanks for the Class Pinmemberaejw20-Jul-08 15:53 
GeneralIf the value is Unicode,like simple chinese charset, there will be a bug Pinmemberlwlojj17-Jul-08 5:17 
GeneralRe: If the value is Unicode,like simple chinese charset, there will be a bug Pinmemberaejw20-Jul-08 15:52 
Questionhelp PinmemberMember 381377111-Feb-08 4:13 
AnswerRe: help Pinmemberaejw20-Jul-08 15:56 
QuestionHigh ASCII chars in value name Pinmemberz00z020-Mar-06 8:27 
AnswerRe: High ASCII chars in value name Pinmemberaejw2-May-06 17:57 
GeneralRe: High ASCII chars in value name Pinmemberz00z04-May-06 10:43 
GeneralNaming convebtions PinmemberGuido_d10-Aug-05 1:15 
GeneralRe: Naming convebtions Pinmemberaejw10-Aug-05 8:51 
GeneralUnicode PinmemberElder Benassi3-Aug-05 22:16 
GeneralRe: Unicode PinsussAnonymous-aejw6-Aug-05 1:49 
Generalerror in ReadSections Pinmemberyurij2-Aug-05 11:08 
GeneralRe: error in ReadSections Pinmemberaejw3-Aug-05 12:56 
QuestionNini?? PinmemberRabidKangaroo20-Apr-05 14:18 
AnswerRe: Nini?? PinmemberYinon Ehrlich14-Jun-05 21:18 
GeneralNative version PinmemberGuido_d20-Apr-05 3:14 
GeneralRe: Native version Pinmemberaejw20-Apr-05 9:28 
GeneralSymbols PinmemberSpeedhawk12-Apr-05 7:59 
GeneralRe: Symbols Pinmemberaejw14-Apr-05 17:32 
GeneralRe: Symbols PinmemberSpeedhawk16-Apr-05 0:42 
GeneralcINI0015.cs Pinmemberzoranl16-Mar-04 18:48 
GeneralRe: cINI0015.cs Pinmemberaejw18-Mar-04 0:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150414.1 | Last Updated 10 Aug 2005
Article Copyright 2004 by aejw
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid