Can I make a few points about your code - Consider using a Dictionary instead of a Hashtable because it's stongly typed there is no unboxing so it's faster. Your also checking if a value exists using Hashtable.ContainsKey() and then your retrieving the value. That means your looking up the key twice. Using Dictionary.TryGetValue() will mean one lookup. - Note this line File.Exists("PLUGINS\\PlugInUltraStik.ini") Your assuming the current directory is GameEx. While this is true this may change during the lifetime of the program. Try this instead string appPath = Path.GetDirectoryName(this.GetType().Assembly.Location); // If it wasn't a dll you would use Application.StartupPath if(File.Exists(Path.Combine(appPath, "PlugInUltraStik.ini")))... - File.ReadAllLines() is a nice way to replace your StreamReader() code. It returns a string[] of all the lines. Then you can just loop through them all. - When splitting the values in the ini file, take a look at string[] lineSplit = line.Split(new char[] { '=' }); if(lineSplit.Length == 2) // lineSplit[0] is the name, lineSplit[1] is the value. Just a few things I thought worth mentioning. Some of it I learnt when moving from .NET 1.1 to .NET 2.0. Lot's of cool new stuff (one of my favourites being the System.Collections.Generic namespace with Dictionary<K, T> and List<T>)