Implement and output TypeInfo.InterfaceUsageIndices
This commit is contained in:
@@ -39,8 +39,10 @@ namespace Il2CppInspector
|
|||||||
else
|
else
|
||||||
writer.Write("class ");
|
writer.Write("class ");
|
||||||
|
|
||||||
var baseText = type.BaseType?.CSharpName ?? string.Empty;
|
var @base = type.ImplementedInterfaces.Select(x => x.CSharpName).ToList();
|
||||||
baseText = (baseText == "object" || baseText == "ValueType" || baseText == string.Empty)? string.Empty : " : " + baseText;
|
if (type.BaseType != null && type.BaseType.FullName != "System.Object" && type.BaseType.FullName != "System.ValueType")
|
||||||
|
@base.Insert(0, type.BaseType.CSharpName);
|
||||||
|
var baseText = @base.Count > 0 ? " : " + string.Join(", ", @base) : string.Empty;
|
||||||
|
|
||||||
writer.Write($"{type.Name}{baseText} // TypeDefIndex: {type.Index}\n{{\n");
|
writer.Write($"{type.Name}{baseText} // TypeDefIndex: {type.Index}\n{{\n");
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace Il2CppInspector
|
|||||||
public Il2CppParameterDefinition[] Params { get; }
|
public Il2CppParameterDefinition[] Params { get; }
|
||||||
public Il2CppFieldDefinition[] Fields { get; }
|
public Il2CppFieldDefinition[] Fields { get; }
|
||||||
public Il2CppFieldDefaultValue[] FieldDefaultValues { get; }
|
public Il2CppFieldDefaultValue[] FieldDefaultValues { get; }
|
||||||
|
public int[] InterfaceUsageIndices { get; }
|
||||||
|
|
||||||
public Dictionary<int, string> Strings { get; } = new Dictionary<int, string>();
|
public Dictionary<int, string> Strings { get; } = new Dictionary<int, string>();
|
||||||
|
|
||||||
@@ -51,7 +52,8 @@ namespace Il2CppInspector
|
|||||||
Params = ReadArray<Il2CppParameterDefinition>(Header.parametersOffset, Header.parametersCount / Sizeof(typeof(Il2CppParameterDefinition)));
|
Params = ReadArray<Il2CppParameterDefinition>(Header.parametersOffset, Header.parametersCount / Sizeof(typeof(Il2CppParameterDefinition)));
|
||||||
Fields = ReadArray<Il2CppFieldDefinition>(Header.fieldsOffset, Header.fieldsCount / Sizeof(typeof(Il2CppFieldDefinition)));
|
Fields = ReadArray<Il2CppFieldDefinition>(Header.fieldsOffset, Header.fieldsCount / Sizeof(typeof(Il2CppFieldDefinition)));
|
||||||
FieldDefaultValues = ReadArray<Il2CppFieldDefaultValue>(Header.fieldDefaultValuesOffset, Header.fieldDefaultValuesCount / Sizeof(typeof(Il2CppFieldDefaultValue)));
|
FieldDefaultValues = ReadArray<Il2CppFieldDefaultValue>(Header.fieldDefaultValuesOffset, Header.fieldDefaultValuesCount / Sizeof(typeof(Il2CppFieldDefaultValue)));
|
||||||
// TODO: Events, Properties, ParameterDefaultValue, GenericParameters, ParameterConstraints, GenericContainers, Interfaces, MetadataUsage, CustomAttributes
|
InterfaceUsageIndices = ReadArray<int>(Header.interfacesOffset, Header.interfacesCount / sizeof(int));
|
||||||
|
// TODO: Events, Properties, ParameterDefaultValue, GenericParameters, ParameterConstraints, GenericContainers, MetadataUsage, CustomAttributes
|
||||||
|
|
||||||
// Get all string literals
|
// Get all string literals
|
||||||
Position = Header.stringOffset;
|
Position = Header.stringOffset;
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ namespace Il2CppInspector.Reflection {
|
|||||||
public List<TypeInfo> GenericTypeParameters { get; }
|
public List<TypeInfo> GenericTypeParameters { get; }
|
||||||
|
|
||||||
public bool HasElementType => ElementType != null;
|
public bool HasElementType => ElementType != null;
|
||||||
|
|
||||||
|
private Il2CppType[] implementedInterfaces;
|
||||||
|
public IEnumerable<TypeInfo> ImplementedInterfaces => implementedInterfaces.Select(x => Assembly.Model.GetType(x, MemberTypes.TypeInfo));
|
||||||
|
|
||||||
public bool IsAbstract => (Attributes & TypeAttributes.Abstract) == TypeAttributes.Abstract;
|
public bool IsAbstract => (Attributes & TypeAttributes.Abstract) == TypeAttributes.Abstract;
|
||||||
public bool IsArray { get; }
|
public bool IsArray { get; }
|
||||||
public bool IsByRef => throw new NotImplementedException();
|
public bool IsByRef => throw new NotImplementedException();
|
||||||
@@ -140,6 +144,11 @@ namespace Il2CppInspector.Reflection {
|
|||||||
if (!IsInterface)
|
if (!IsInterface)
|
||||||
Attributes |= TypeAttributes.Class;
|
Attributes |= TypeAttributes.Class;
|
||||||
|
|
||||||
|
// Add all implemented interfaces
|
||||||
|
implementedInterfaces = new Il2CppType[Definition.interfaces_count];
|
||||||
|
for (var i = 0; i < Definition.interfaces_count; i++)
|
||||||
|
implementedInterfaces[i] = pkg.TypeUsages[pkg.Metadata.InterfaceUsageIndices[Definition.interfacesStart + i]];
|
||||||
|
|
||||||
// Add all fields
|
// Add all fields
|
||||||
for (var f = Definition.fieldStart; f < Definition.fieldStart + Definition.field_count; f++)
|
for (var f = Definition.fieldStart; f < Definition.fieldStart + Definition.field_count; f++)
|
||||||
DeclaredFields.Add(new FieldInfo(pkg, f, this));
|
DeclaredFields.Add(new FieldInfo(pkg, f, this));
|
||||||
|
|||||||
Reference in New Issue
Block a user