/// <summary> /// Load a LibVlc function from unmanaged to managed. /// </summary> /// <exception cref="TypeLoadException">A custom attribute type cannot be loaded. </exception> /// <exception cref="NoLibVlcFunctionAttributeException"> /// For LibVlcFunction, need LibVlcFunctionAttribute to get Infomation /// of function. /// </exception> /// <exception cref="FunctionNotFoundException">Can't find function in dll.</exception> public LibVlcFunction(IntPtr libHandle, LibVlcVersion version) { IsEnable = false; _version = version; var attrs = typeof(T).GetCustomAttributes(typeof(LibVlcFunctionAttribute), false); foreach (var item in attrs) { if (item is LibVlcFunctionAttribute) { FunctionInfomation = item as LibVlcFunctionAttribute; break; } } if (FunctionInfomation == null) { throw new NoLibVlcFunctionAttributeException(); } if (_version == null || _version.IsFunctionAvailable(FunctionInfomation)) { IntPtr procAddress; try { procAddress = Win32Api.GetProcAddress(libHandle, FunctionInfomation.FunctionName.Trim()); } catch (Win32Exception e) { throw new FunctionNotFoundException(FunctionInfomation, _version, e); } var del = Marshal.GetDelegateForFunctionPointer(procAddress, typeof(T)); _functionDelegate = (T)Convert.ChangeType(del, typeof(T)); IsEnable = true; } }
/// <summary> /// Load LibVlc dlls, and mapping all function. /// </summary> /// <param name="libVlcDirectory">directory of LibVlc</param> /// <exception cref="LibVlcLoadLibraryException"> /// Can't load LibVlc dlls, check the platform and LibVlc target platform /// (should be same, x86 or x64). /// </exception> /// <exception cref="TypeLoadException">A custom attribute type cannot be loaded. </exception> /// <exception cref="NoLibVlcFunctionAttributeException"> /// For LibVlcFunction, need LibVlcFunctionAttribute to get Infomation /// of function. /// </exception> /// <exception cref="FunctionNotFoundException">Can't find function in dll.</exception> /// <exception cref="VersionStringParseException">Can't parse libvlc version string, it must like "2.2.0-Meta Weatherwax".</exception> /// <exception cref="OverflowException"> /// At least one component of version represents a number greater than /// <see cref="F:System.Int32.MaxValue" />. /// </exception> public static void LoadLibVlc(String libVlcDirectory = null) { LibVlcDirectory = libVlcDirectory == null ? "" : libVlcDirectory; if (IsLibLoaded) return; try { FileInfo libcore = new FileInfo(Path.Combine(LibVlcDirectory, "libvlccore.dll")); FileInfo libvlc = new FileInfo(Path.Combine(LibVlcDirectory, "libvlc.dll")); LibVlcVCoreHandle = Win32Api.LoadLibrary(libcore.FullName); LibVlcHandle = Win32Api.LoadLibrary(libvlc.FullName); } catch (Win32Exception e) { throw new LibVlcLoadLibraryException(e); } _getVersionFunction = new LibVlcFunction<GetVersion>(); LibVlcVersion = new LibVlcVersion(GetVersion()); _getCompilerFunction = new LibVlcFunction<GetCompiler>(); _getChangesetFunction = new LibVlcFunction<GetChangeset>(); _freeFunction = new LibVlcFunction<Free>(); _releaseLibVlcModuleDescriptionFunction = new LibVlcFunction<ReleaseLibVlcModuleDescription>(); _releaseAudioOutputListFunction = new LibVlcFunction<ReleaseAudioOutputList>(); _releaseAudioDeviceListFunction = new LibVlcFunction<ReleaseAudioDeviceList>(); _releaseTrackDescriptionFunction = new LibVlcFunction<ReleaseTrackDescription>(); _releaseTracksFunction = new LibVlcFunction<ReleaseTracks>(); Vlc.LoadLibVlc(); VlcError.LoadLibVlc(); VlcEventManager.LoadLibVlc(); VlcMedia.LoadLibVlc(); VlcMediaPlayer.LoadLibVlc(); AudioEqualizer.LoadLibVlc(); }