/// <summary> /// Check a function is available for this version. /// </summary> /// <param name="functionInfo"></param> /// <returns></returns> public bool IsFunctionAvailable(LibVlcFunctionAttribute functionInfo) { var result = true; if (functionInfo.MinVersion != null) { result = functionInfo.MinVersion < Version; } if (functionInfo.MaxVersion != null) { result = result && Version < functionInfo.MaxVersion; } if (functionInfo.Dev != null) { result = result && DevString == functionInfo.Dev; } return(result); }
/// <summary> /// 使用提供的指定版本的 LibVlc 库句柄初始化一个 LibVlcFunction /// </summary> /// <param name="libHandle">提供的 LibVlc 库句柄</param> /// <param name="libVersion">库版本</param> public LibVlcFunction(IntPtr libHandle, Version libVersion, String Dev) { IsEnable = false; object[] attrs = typeof(T).GetCustomAttributes(typeof(LibVlcFunctionAttribute), false); LibVlcFunctionAttribute functionInfo = null; foreach (var item in attrs) { if (item is LibVlcFunctionAttribute) { functionInfo = item as LibVlcFunctionAttribute; break; } } if (functionInfo == null) { throw new Exception("对于 LibVlcFunction,需要添加 LibVlcFunctionAttribute 才能正常读取函数"); } FunctionName = functionInfo.FunctionName; if ((libVersion == null || ((functionInfo.MinVersion == null || functionInfo.MinVersion <= libVersion) && (functionInfo.MaxVersion == null || functionInfo.MaxVersion >= libVersion))) && (functionInfo.Dev == null || functionInfo.Dev == Dev)) { IsEnable = true; IntPtr procAddress; try { procAddress = Win32API.GetProcAddress(libHandle, FunctionName); } catch (Win32Exception e) { throw new Exception(String.Format("在提供的 LibVlc 中找不到函数 {0}", FunctionName), e); } var del = Marshal.GetDelegateForFunctionPointer(procAddress, typeof(T)); functionDelegate = (T)Convert.ChangeType(del, typeof(T)); } }