public void findAllMemberRefs(ref int typeIndex) { memberRefFinder = new MemberRefFinder(); memberRefFinder.findAll(ModuleDefMD); allMethods = new List <MethodDef>(memberRefFinder.methodDefs.Keys); var allTypesList = new List <MTypeDef>(); foreach (var type in memberRefFinder.typeDefs.Keys) { var typeDef = new MTypeDef(type, this, typeIndex++); types.add(typeDef); allTypesList.Add(typeDef); typeDef.addMembers(); } var allTypesCopy = new List <MTypeDef>(allTypesList); var typeToIndex = new Dictionary <TypeDef, int>(); for (int i = 0; i < allTypesList.Count; i++) { typeToIndex[allTypesList[i].TypeDef] = i; } foreach (var typeDef in allTypesList) { if (typeDef.TypeDef.NestedTypes == null) { continue; } foreach (var nestedTypeDef2 in typeDef.TypeDef.NestedTypes) { int index = typeToIndex[nestedTypeDef2]; var nestedTypeDef = allTypesCopy[index]; allTypesCopy[index] = null; if (nestedTypeDef == null) // Impossible { throw new ApplicationException("Nested type belongs to two or more types"); } typeDef.add(nestedTypeDef); nestedTypeDef.NestingType = typeDef; } } }
public MTypeDef resolveOther(ITypeDefOrRef type) { if (type == null) { return(null); } type = type.ScopeType; if (type == null) { return(null); } MTypeDef typeDef; if (typeToTypeDefDict.tryGetValue(type, out typeDef)) { return(typeDef); } var typeDef2 = deobfuscatorContext.resolveType(type); if (typeDef2 == null) { typeToTypeDefDict.tryGetSimilarValue(type, out typeDef); typeToTypeDefDict[type] = typeDef; return(typeDef); } if (typeToTypeDefDict.tryGetValue(typeDef2, out typeDef)) { typeToTypeDefDict[type] = typeDef; return(typeDef); } typeToTypeDefDict[type] = null; // In case of a circular reference typeToTypeDefDict[typeDef2] = null; typeDef = new MTypeDef(typeDef2, null, 0); typeDef.addMembers(); foreach (var iface in typeDef.TypeDef.Interfaces) { var ifaceDef = resolveOther(iface.Interface); if (ifaceDef == null) { continue; } typeDef.addInterface(ifaceDef, iface.Interface); } var baseDef = resolveOther(typeDef.TypeDef.BaseType); if (baseDef != null) { typeDef.addBaseType(baseDef, typeDef.TypeDef.BaseType); } typeToTypeDefDict[type] = typeDef; if (type != typeDef2) { typeToTypeDefDict[typeDef2] = typeDef; } return(typeDef); }