private static IEnumerable <DllImportXOptions> GetMethods(Type iface, DllImportXFilter filter, out IEnumerable <MethodInfo> others) { var methods = new { Imports = new List <DllImportXOptions>(), Others = new List <MethodInfo>() }; foreach (var x in iface.GetMethods()) { if (x.GetCustomAttributes(typeof(DllImportXAttribute), false).FirstOrDefault() == null) { methods.Others.Add(x); } else { methods.Imports.Add(new DllImportXOptions(x)); } } if (filter != null) { foreach (var import in methods.Imports) { filter(import); } } others = methods.Others; return(methods.Imports); }
public static T Build <T>(DllImportXFilter filter) where T : class { var type = typeof(T); var concreteType = ImplementInterface(type, filter); return((T)Activator.CreateInstance(concreteType)); }
public static Type ImplementInterface(Type iface, DllImportXFilter filter) { var assemblyName = new AssemblyName("DllImportX"); #if NET35 var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); #else var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); #endif var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name); var typeBuilder = DeclareType(iface, moduleBuilder); var methods = GetMethods(iface, filter, out var otherMethods); DefineImportMethods(typeBuilder, methods); DefineNotImplementedMethods(typeBuilder, otherMethods); return(typeBuilder.CreateType()); }