public virtual void Dispose(bool disposing)
 {
     if (myLibVlcDllHandle != IntPtr.Zero)
     {
         Win32Interops.FreeLibrary(myLibVlcDllHandle);
         myLibVlcDllHandle = IntPtr.Zero;
     }
     if (myLibVlcCoreDllHandle != IntPtr.Zero)
     {
         Win32Interops.FreeLibrary(myLibVlcCoreDllHandle);
         myLibVlcCoreDllHandle = IntPtr.Zero;
     }
     if (myLibGccDllHandle != IntPtr.Zero)
     {
         Win32Interops.FreeLibrary(myLibGccDllHandle);
         myLibGccDllHandle = IntPtr.Zero;
     }
 }
        internal T GetInteropDelegate <T>()
        {
            string vlcFunctionName = null;

            try
            {
#if NETSTANDARD1_3
                var attrs = typeof(T).GetTypeInfo().GetCustomAttributes(typeof(LibVlcFunctionAttribute), false).ToArray();
#else
                var attrs = typeof(T).GetCustomAttributes(typeof(LibVlcFunctionAttribute), false);
#endif
                if (attrs.Length == 0)
                {
                    throw new Exception("Could not find the LibVlcFunctionAttribute.");
                }
                var attr = (LibVlcFunctionAttribute)attrs[0];
                vlcFunctionName = attr.FunctionName;
                if (myInteropDelegates.ContainsKey(vlcFunctionName))
                {
                    return((T)myInteropDelegates[attr.FunctionName]);
                }

                var procAddress = Win32Interops.GetProcAddress(myLibVlcDllHandle, attr.FunctionName);
                if (procAddress == IntPtr.Zero)
                {
                    throw new Win32Exception();
                }

                object delegateForFunctionPointer;
#if NET20 || NET35 || NET40 || NET45
                delegateForFunctionPointer = Marshal.GetDelegateForFunctionPointer(procAddress, typeof(T));
#else
                // The GetDelegateForFunctionPointer with two parameters is now deprecated.
                delegateForFunctionPointer = Marshal.GetDelegateForFunctionPointer <T>(procAddress);
#endif
                myInteropDelegates[attr.FunctionName] = delegateForFunctionPointer;
                return((T)delegateForFunctionPointer);
            }
            catch (Win32Exception e)
            {
                throw new MissingMethodException(string.Format("The address of the function '{0}' does not exist in libvlc library.", vlcFunctionName), e);
            }
        }
        protected VlcInteropsManager(DirectoryInfo dynamicLinkLibrariesPath)
        {
            if (!dynamicLinkLibrariesPath.Exists)
            {
                throw new DirectoryNotFoundException();
            }

            var libGccDllPath = Path.Combine(dynamicLinkLibrariesPath.FullName, "libgcc_s_seh-1.dll");

            if (File.Exists(libGccDllPath))
            {
                myLibGccDllHandle = Win32Interops.LoadLibrary(libGccDllPath);
                if (myLibGccDllHandle == IntPtr.Zero)
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }

            var libVlcCoreDllPath = Path.Combine(dynamicLinkLibrariesPath.FullName, "libvlccore.dll");

            if (!File.Exists(libVlcCoreDllPath))
            {
                throw new FileNotFoundException();
            }
            myLibVlcCoreDllHandle = Win32Interops.LoadLibrary(libVlcCoreDllPath);
            if (myLibVlcCoreDllHandle == IntPtr.Zero)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }

            var libVlcDllPath = Path.Combine(dynamicLinkLibrariesPath.FullName, "libvlc.dll");

            if (!File.Exists(libVlcDllPath))
            {
                throw new FileNotFoundException();
            }
            myLibVlcDllHandle = Win32Interops.LoadLibrary(libVlcDllPath);
            if (myLibVlcDllHandle == IntPtr.Zero)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
        }