public TypeDef resolveOther(TypeReference type) { if (type == null) { return(null); } type = type.GetElementType(); TypeDef typeDef; if (typeToTypeDefDict.tryGetValue(type, out typeDef)) { return(typeDef); } var typeDefinition = deobfuscatorContext.resolve(type); if (typeDefinition == null) { typeToTypeDefDict.tryGetSimilarValue(type, out typeDef); typeToTypeDefDict[type] = typeDef; return(typeDef); } if (typeToTypeDefDict.tryGetValue(typeDefinition, out typeDef)) { typeToTypeDefDict[type] = typeDef; return(typeDef); } typeToTypeDefDict[type] = null; // In case of a circular reference typeToTypeDefDict[typeDefinition] = null; typeDef = new TypeDef(typeDefinition, null, 0); typeDef.addMembers(); foreach (var iface in typeDef.TypeDefinition.Interfaces) { var ifaceDef = resolveOther(iface); if (ifaceDef == null) { continue; } typeDef.addInterface(ifaceDef, iface); } var baseDef = resolveOther(typeDef.TypeDefinition.BaseType); if (baseDef != null) { typeDef.addBaseType(baseDef, typeDef.TypeDefinition.BaseType); } typeToTypeDefDict[type] = typeDef; if (type != typeDefinition) { typeToTypeDefDict[typeDefinition] = typeDef; } return(typeDef); }
public void findAllMemberReferences(ref int typeIndex) { memberRefFinder = new MemberRefFinder(); memberRefFinder.findAll(ModuleDefinition, ModuleDefinition.Types); allMethods = new List <MethodDefinition>(memberRefFinder.methodDefinitions.Keys); var allTypesList = new List <TypeDef>(); foreach (var type in memberRefFinder.typeDefinitions.Keys) { var typeDef = new TypeDef(type, this, typeIndex++); types.add(typeDef); allTypesList.Add(typeDef); typeDef.addMembers(); } var allTypesCopy = new List <TypeDef>(allTypesList); var typeToIndex = new Dictionary <TypeDefinition, int>(); for (int i = 0; i < allTypesList.Count; i++) { typeToIndex[allTypesList[i].TypeDefinition] = i; } foreach (var typeDef in allTypesList) { if (typeDef.TypeDefinition.NestedTypes == null) { continue; } foreach (var nestedTypeDefinition in typeDef.TypeDefinition.NestedTypes) { int index = typeToIndex[nestedTypeDefinition]; 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; } } }