public static IntPtr libvlc_new(string[] parameters, ref libvlc_exception_t exception) { if (parameters.Length > 10) { throw new ArgumentException("Too many items in array, maximum 10 allowed", "parameters"); } // PointerToArrayOfPointerHelper argv = new PointerToArrayOfPointerHelper(); argv.pointers = new IntPtr[11]; // Assembly assembly = Assembly.GetEntryAssembly(); if (assembly != null) { argv.pointers[0] = Marshal.StringToHGlobalAnsi(assembly.Location); } else { assembly = Assembly.GetExecutingAssembly(); argv.pointers[0] = Marshal.StringToHGlobalAnsi(assembly.Location); } for (int i = 0; i < parameters.Length; i++) { argv.pointers[i + 1] = Marshal.StringToHGlobalAnsi(parameters[i]); } IntPtr argvPtr = IntPtr.Zero; try { int size = Marshal.SizeOf(typeof(PointerToArrayOfPointerHelper)); argvPtr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(argv, argvPtr, false); return(libvlc_new(parameters.Length + 1, argvPtr, ref exception)); } finally { for (int i = 0; i < parameters.Length + 1; i++) { if (argv.pointers[i] != IntPtr.Zero) { Marshal.FreeHGlobal(argv.pointers[i]); } } if (argvPtr != IntPtr.Zero) { Marshal.FreeHGlobal(argvPtr); } } }
public static IntPtr libvlc_new(string[] parameters, ref libvlc_exception_t exception) { if (parameters.Length > 10) { throw new ArgumentException("Too many items in array, maximum 10 allowed", "parameters"); } // PointerToArrayOfPointerHelper argv = new PointerToArrayOfPointerHelper(); argv.pointers = new IntPtr[11]; // Assembly assembly = Assembly.GetEntryAssembly(); if (assembly != null) { argv.pointers[0] = Marshal.StringToHGlobalAnsi(assembly.Location); } else { assembly = Assembly.GetExecutingAssembly(); argv.pointers[0] = Marshal.StringToHGlobalAnsi(assembly.Location); } for (int i = 0; i < parameters.Length; i++) { argv.pointers[i + 1] = Marshal.StringToHGlobalAnsi(parameters[i]); } IntPtr argvPtr = IntPtr.Zero; try { int size = Marshal.SizeOf(typeof (PointerToArrayOfPointerHelper)); argvPtr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(argv, argvPtr, false); return libvlc_new(parameters.Length + 1, argvPtr, ref exception); } finally { for (int i = 0; i < parameters.Length + 1; i++) { if (argv.pointers[i] != IntPtr.Zero) { Marshal.FreeHGlobal(argv.pointers[i]); } } if (argvPtr != IntPtr.Zero) { Marshal.FreeHGlobal(argvPtr); } } }