예제 #1
0
        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);
        }
예제 #2
0
        public static T Build <T>(DllImportXFilter filter) where T : class
        {
            var type = typeof(T);

            var concreteType = ImplementInterface(type, filter);

            return((T)Activator.CreateInstance(concreteType));
        }
예제 #3
0
        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());
        }