/// <summary> /// Gets an exported function /// </summary> public static TDelegate GetExportedFunction <TDelegate>(string dllName, string fn) where TDelegate : Delegate { var hModule = Kernel32.GetModuleHandle(dllName); var hFn = Kernel32.GetProcAddress(hModule, fn); return(DelegateCreator.CreateDelegate <TDelegate>(hFn)); }
/// <summary> /// Dynamically creates a <see cref="Delegate" />. /// </summary> /// <param name="ptr">Function pointer</param> /// <param name="returnType">Return type of the <see cref="Delegate" /></param> /// <param name="args">Delegate arguments</param> /// <returns>A matching <see cref="Delegate" /></returns> private static Delegate CreateFluidCallDelegate(Pointer <byte> ptr, Type returnType, object[] args) { var argTypes = new List <Type>(); argTypes.AddRange(args.Select(o => o.GetType())); argTypes.Add(returnType); var type = Expression.GetDelegateType(argTypes.ToArray()); return(DelegateCreator.CreateDelegate(ptr, type)); }
/// <summary> /// Creates a <see cref="Delegate" /> from a function pointer. /// <remarks> /// Similar to <see cref="Marshal.GetDelegateForFunctionPointer{TDelegate}"/> /// </remarks> /// </summary> /// <param name="ptr">Function pointer</param> /// <typeparam name="TDelegate"><see cref="Delegate" /> type</typeparam> /// <returns>A <see cref="Delegate" /> from <paramref name="ptr" /></returns> public static TDelegate CreateDelegate <TDelegate>(Pointer <byte> ptr) where TDelegate : Delegate { return((TDelegate)DelegateCreator.CreateDelegate(ptr, typeof(TDelegate))); }