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