Пример #1
0
        public static void Bind(string dllPath)
        {
            /*var file = Path.GetFileName(dllPath);
             * if (IgnoreAssemblySet.Contains(file))
             *  return;*/

            DecompilerSetting = new DecompilerSettings(LanguageVersion.CSharp7);
            DecompilerSetting.ThrowOnAssemblyResolveErrors = false;
            Decompiler = new CSharpDecompiler(dllPath, DecompilerSetting);
            var dir = Path.GetDirectoryName(dllPath);
            DefaultAssemblyResolver resolver = new DefaultAssemblyResolver();

            resolver.AddSearchDirectory(dir);
            ReaderParameters parameters = new ReaderParameters()
            {
                AssemblyResolver = resolver,
                ReadSymbols      = false,
            };

            ModuleDefinition module = ModuleDefinition.ReadModule(dllPath, parameters);

            moduleSet.Add(module);
            ICallGenerater.AddWrapperAssembly(module.Assembly.Name.Name);
            CSCGenerater.AdapterCompiler.AddReference(module.Name);
            foreach (var refAssembly in module.AssemblyReferences)
            {
                CSCGenerater.AdapterCompiler.AddReference(refAssembly.Name + ".dll");
                CSCGenerater.AdapterWrapperCompiler.AddReference(refAssembly.Name + ".dll");
            }

            moduleTypes = new HashSet <TypeReference>(module.Types);

            foreach (TypeDefinition type in moduleTypes)
            {
                if (!type.IsPublic)
                {
                    continue;
                }

                AddType(type);
            }

            TypeResolver.WrapperSide = true;

            while (generaters.Count > 0)
            {
                var gener = generaters.Dequeue();
                if (gener != null)
                {
                    gener.Gen();
                }
            }
            generaters.Clear();
        }
Пример #2
0
        public static void Bind(string dllPath)
        {
            var dir = Path.GetDirectoryName(dllPath);
            DefaultAssemblyResolver resolver = new DefaultAssemblyResolver();

            resolver.AddSearchDirectory(dir);
            ReaderParameters parameters = new ReaderParameters()
            {
                AssemblyResolver = resolver,
                ReadSymbols      = false,
            };

            ModuleDefinition module = ModuleDefinition.ReadModule(dllPath, parameters);

            moduleSet.Add(module);

            var moduleTypes = new HashSet <TypeReference>(module.Types);

            foreach (TypeDefinition type in moduleTypes)
            {
                //Utils.Log(type.FullName);
                if (!CUtils.Filter(type))
                {
                    Utils.Log("ignor type:" + type.FullName);
                    continue;
                }

                foreach (var method in type.Methods)
                {
                    if (CUtils.IsIcall(method))
                    {
                        if (!CUtils.Filter(method))
                        {
                            Utils.Log("ignor icall:" + method.FullName);
                            continue;
                        }

                        ICallGenerater.AddMethod(method);
                    }
                    else if (CUtils.IsEventCallback(method) && !method.IsConstructor)
                    {
                        if (!CUtils.Filter(method))
                        {
                            Utils.Log("ignor event:" + method.FullName);
                            continue;
                        }

                        EventGenerater.AddMethod(method);
                    }
                }
            }
        }
Пример #3
0
        public static void End()
        {
            EventGenerater.Gen();
            ICallGenerater.Gen();
            ClassCacheGenerater.Gen();

            foreach (var m in moduleSet)
            {
                m.Dispose();
            }

            moduleSet.Clear();
        }