示例#1
0
        private void InjectMethod(TypeDefinition type, MethodDefinition method)
        {
            if (type.Name.Contains("<") || type.IsInterface || type.Methods.Count == 0) // skip anonymous type and interface
            {
                return;
            }
            if (method.Name == ".cctor")
            {
                return;
            }
            if (method.Name == ".ctor")
            {
                return;
            }

            //寻找一个用于注入的委托
            TypeDefinition delegateTypeRef = FindDelegateFunction(method);

            if (delegateTypeRef != null)
            {
                //在type里面定义一个字段,类型是我们刚刚找到的委托方法
                string delegateFieldName = ILName.GenerateMethodName(method);
                m_NameLines.Add(new NameLine()
                {
                    Method = delegateTypeRef, Name = delegateFieldName
                });
                if (!m_IsWriteName)
                {
                    ILGen.GenIL(delegateFieldName, type, method, delegateTypeRef, m_FieldDelegateNameTD);
                }
            }
        }
示例#2
0
        public void InjectAssembly(string dllPath, string delegatePath, bool isWriteName)
        {
            m_IsWriteName = isWriteName;
            var readerParameters = new ReaderParameters {
                ReadSymbols = false
            };
            AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(dllPath, readerParameters);

            m_NameLines.Clear();
            Stopwatch watch = new Stopwatch();

            watch.Reset();
            watch.Start();
            foreach (var module in assembly.Modules)
            {
                List <TypeDefinition> types            = module.Types.ToList();
                TypeDefinition        FunctionDelegate = types.Find((td) => td.FullName.Contains("LCLFunctionDelegate"));
                if (FunctionDelegate != null)
                {
                    m_DelegateFunctions = FunctionDelegate.NestedTypes.ToList().FindAll((_type) =>
                    {
                        string name = _type.BaseType.Name;
                        return(name == typeof(Delegate).Name || name == typeof(MulticastDelegate).Name);
                    });
                    if (m_DelegateFunctions != null && m_DelegateFunctions.Count > 0)
                    {
                        break;
                    }
                }
            }
            watch.Stop();
            UnityEngine.Debug.Log("查找委托 time:" + watch.ElapsedMilliseconds);

            if (!isWriteName)
            {
                foreach (var module in assembly.Modules)
                {
                    List <TypeDefinition> types = module.Types.ToList();
                    m_FieldDelegateNameTD = types.Find((td) => td.FullName.Contains("LCLFieldDelegateName"));
                    if (m_FieldDelegateNameTD != null)
                    {
                        break;
                    }
                }
            }

            watch.Reset();
            watch.Start();
            foreach (var module in assembly.Modules)
            {
                foreach (var typ in module.Types)
                {
                    if (Filter.FilterType(typ))
                    {
                        continue;
                    }
                    foreach (var method in typ.Methods)
                    {
                        if (isWriteName)
                        {
                            if (!Filter.FilterMethod(method))
                            {
                                continue;
                            }
                        }

                        InjectMethod(typ, method);
                    }
                }
            }
            watch.Stop();
            UnityEngine.Debug.Log("委托字段 time:" + watch.ElapsedMilliseconds);

            if (!isWriteName)
            {
                var writerParameters = new WriterParameters {
                    WriteSymbols = true
                };
                assembly.Write(dllPath, writerParameters);


                if (assembly.MainModule.SymbolReader != null)
                {
                    assembly.MainModule.SymbolReader.Dispose();
                }
            }
            else
            {
                ILName.WritedFieldDelegateName(delegatePath, m_NameLines);
            }
        }
示例#3
0
        public void InjectAssembly(string dllPath, string delegatePath, bool isWriteName)
        {
            m_IsWriteName = isWriteName;
            var readerParameters = new ReaderParameters {
                ReadSymbols = false
            };
            AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(dllPath, readerParameters);

            m_NameLines.Clear();
            foreach (var module in assembly.Modules)
            {
                List <TypeDefinition> types            = module.Types.ToList();
                TypeDefinition        FunctionDelegate = types.Find((td) => { return(td.FullName.Contains("FunctionDelegate")); });
                if (FunctionDelegate != null)
                {
                    m_DelegateFunctions = FunctionDelegate.NestedTypes.ToList();
                    if (m_DelegateFunctions != null && m_DelegateFunctions.Count > 0)
                    {
                        break;
                    }
                }
            }


            foreach (var module in assembly.Modules)
            {
                List <TypeDefinition> types = module.Types.ToList();
                m_FieldDelegateNameTD = types.Find((td) => { return(td.FullName.Contains("LCLFieldDelegateName")); });
                if (m_FieldDelegateNameTD != null)
                {
                    break;
                }
            }


            foreach (var module in assembly.Modules)
            {
                foreach (var typ in module.Types)
                {
                    if (typ.Namespace == null || !typ.Namespace.Contains("LCL"))
                    {
                        continue;
                    }
                    foreach (var method in typ.Methods)
                    {
                        InjectMethod(typ, method);
                    }
                }
            }

            if (!isWriteName)
            {
                var writerParameters = new WriterParameters {
                    WriteSymbols = true
                };
                assembly.Write(dllPath, writerParameters);


                if (assembly.MainModule.SymbolReader != null)
                {
                    assembly.MainModule.SymbolReader.Dispose();
                }
            }
            else
            {
                ILName.WritedFieldDelegateName(delegatePath, m_NameLines);
            }
        }