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));
        }