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