From 6322246566cf5176df296d934645f9cb1db7e31a Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Fri, 8 Jan 2021 01:03:56 +0100 Subject: [PATCH] DLL: Handle generic type references --- .../Outputs/AssemblyShims.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Il2CppInspector.Common/Outputs/AssemblyShims.cs b/Il2CppInspector.Common/Outputs/AssemblyShims.cs index 0d4b8cb..69a0cff 100644 --- a/Il2CppInspector.Common/Outputs/AssemblyShims.cs +++ b/Il2CppInspector.Common/Outputs/AssemblyShims.cs @@ -207,12 +207,31 @@ namespace Il2CppInspector.Outputs } // Convert Il2CppInspector TypeInfo into type reference imported to specified module - private TypeRef GetTypeRef(ModuleDef module, TypeInfo type) { + private ITypeDefOrRef GetTypeRef(ModuleDef module, TypeInfo type) { if (type == null) return null; + // Generic type parameter + if (type.IsGenericParameter) + return new GenericVar(type.GenericParameterPosition).ToTypeDefOrRef(); + + // Get module that owns the type var typeOwnerModule = modules.First(a => a.Name == type.Assembly.ShortName); - return module.Import(new TypeRefUser(typeOwnerModule, type.Namespace, type.BaseName, typeOwnerModule)); + + // Get reference to type + var typeRef = new TypeRefUser(typeOwnerModule, type.Namespace, type.BaseName, typeOwnerModule); + + // Non-generic type + if (!type.GetGenericArguments().Any()) + return module.Import(typeRef); + + // Generic type requires generic arguments + var genericInstSig = new GenericInstSig(typeRef.ToTypeSig().ToClassOrValueTypeSig(), type.GenericTypeArguments.Length); + + foreach (var gp in type.GenericTypeArguments) + genericInstSig.GenericArguments.Add(GetTypeRef(module, gp).ToTypeSig()); + + return module.Import(genericInstSig).ToTypeDefOrRef(); } // Generate and save all DLLs