public object?GenerateImplementation(Type t) { AssemblyBuilder asmBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(t.Name + "Asm"), AssemblyBuilderAccess.Run); ModuleBuilder moduleBuilder = asmBuilder.DefineDynamicModule(t.Name + "Module"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Default" + t.Name); typeBuilder.AddInterfaceImplementation(t); var methods = t.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (var method in methods) { var parameters = method.GetParameters().Select(x => x.ParameterType).ToArray(); var methodBuilder = typeBuilder.DefineMethod(method.Name, MethodAttributes.Virtual | MethodAttributes.Public, method.ReturnType, parameters); var nativeCallAttribute = method.GetCustomAttribute <NativeCallAttribute>(); string nativeName = method.Name; if (nativeCallAttribute != null && nativeCallAttribute.NativeName != null) { nativeName = nativeCallAttribute.NativeName; } ilGenerator.GenerateMethod(methodBuilder.GetILGenerator(), methodBuilder.ReturnType, parameters, functionPointerLoader.GetProcAddress(nativeName), true); } var typeInfo = typeBuilder.CreateTypeInfo(); return(typeInfo?.GetConstructor(new Type[0]).Invoke(null)); }