using System; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace XImaging.Automation.Library.HxDriverLib { /// /// INI文件读写类 /// public class IniHelper { #region API函数声明 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] //返回0表示失败,非0为成功 private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] //返回取得字符串缓冲区的长度 private static extern uint GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); #endregion #region 封装 /// /// 从INI文件读取值 /// /// /// /// /// /// /// public static T IniGetValue(string iniFile, string section, string key, T defaultValue = default(T)) { if (string.IsNullOrEmpty(section)) { LogConstant.logger.Print("未指定节点名称(Section)"); return defaultValue; } if (string.IsNullOrEmpty(key)) { LogConstant.logger.Print("未指定节点名称(Key)"); return defaultValue; } string strValue = defaultValue.ToString(); ; const int SIZE = 1024 * 10; StringBuilder sb = new StringBuilder(SIZE); uint bytesReturned = GetPrivateProfileString(section, key, defaultValue.ToString(), sb, SIZE, iniFile); if (bytesReturned != 0) strValue = sb.ToString(); sb = null; Type t = typeof(T); if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) //支持可空类型 t = t.GetGenericArguments()[0]; var tryParse = t.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder , new Type[] { strValue.GetType(), t.MakeByRefType() } , new ParameterModifier[] { new ParameterModifier(2) }); if (tryParse != null) { var parameters = new object[] { strValue, Activator.CreateInstance(t) }; bool success = (bool)tryParse.Invoke(null, parameters); if (success) return (T)parameters[1]; else return defaultValue; } return (T)Convert.ChangeType(strValue, typeof(T)); } /// /// 向INI文件写值 /// /// /// /// /// /// /// public static bool IniWriteValue(string iniFile, string section, string key, T value) { if (string.IsNullOrEmpty(section)) { LogConstant.logger.Print("未指定节点名称(Section)"); return false; } if (string.IsNullOrEmpty(key)) { LogConstant.logger.Print("未指定节点名称(Key)"); return false; } return WritePrivateProfileString(section, key, value.ToString(), iniFile); } #endregion } }