From c56a4c6a3ad6126bbc1c54b0bd87f3a0ea43ec67 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Sun, 10 Jan 2021 03:32:03 +0100 Subject: [PATCH] DLL: Forward declare all assemblies --- .../Outputs/AssemblyShims.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Il2CppInspector.Common/Outputs/AssemblyShims.cs b/Il2CppInspector.Common/Outputs/AssemblyShims.cs index 64431e2..32083eb 100644 --- a/Il2CppInspector.Common/Outputs/AssemblyShims.cs +++ b/Il2CppInspector.Common/Outputs/AssemblyShims.cs @@ -7,13 +7,11 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.IO; using System.Linq; using dnlib.DotNet; using dnlib.DotNet.Emit; using Il2CppInspector.Reflection; -using Assembly = System.Reflection.Assembly; using BindingFlags = System.Reflection.BindingFlags; namespace Il2CppInspector.Outputs @@ -70,7 +68,7 @@ namespace Il2CppInspector.Outputs private const string rootNamespace = "Il2CppInspector.DLL"; // All modules (single-module assemblies) - private List modules = new List(); + private Dictionary modules = new Dictionary(); public AssemblyShims(TypeModel model) => this.model = model; @@ -133,7 +131,7 @@ namespace Il2CppInspector.Outputs var module = new ModuleDefUser(name) { Kind = ModuleKind.Dll }; // Create assembly - var ourVersion = Assembly.GetAssembly(typeof(Il2CppInspector)).GetName().Version; + var ourVersion = System.Reflection.Assembly.GetAssembly(typeof(Il2CppInspector)).GetName().Version; var asm = new AssemblyDefUser(name.Replace(".dll", ""), ourVersion); // Add module to assembly @@ -454,7 +452,7 @@ namespace Il2CppInspector.Outputs return new ByRefSig(GetTypeSig(module, type.ElementType)); // Get module that owns the type - var typeOwnerModule = modules.First(a => a.Name == type.Assembly.ShortName); + var typeOwnerModule = modules[type.Assembly]; var typeOwnerModuleRef = new ModuleRefUser(typeOwnerModule); // Get reference to type; use nested type as resolution scope if applicable @@ -491,23 +489,25 @@ namespace Il2CppInspector.Outputs // We have to do this before adding anything else so we can reference every type modules.Clear(); + // Create all assemblies foreach (var asm in model.Assemblies) { // Create assembly and add primary module to list var module = CreateAssembly(asm.ShortName); - modules.Add(module); - - // Add custom attribute attributes - foreach (var ca in asm.CustomAttributes) - AddCustomAttribute(module, module.Assembly, ca); - - // Add all types - // Only references to previously-added modules will be resolved - foreach (var type in asm.DefinedTypes.Where(t => !t.IsNested)) - AddType(module, type); + modules.Add(asm, module); } + // Add custom attribute attributes (must do this after all assemblies are created due to type referencing) + foreach (var asm in model.Assemblies) + foreach (var ca in asm.CustomAttributes) + AddCustomAttribute(modules[asm], modules[asm].Assembly, ca); + + // Add all types + foreach (var asm in model.Assemblies) + foreach (var type in asm.DefinedTypes.Where(t => !t.IsNested)) + AddType(modules[asm], type); + // Write all assemblies to disk - foreach (var asm in modules) + foreach (var asm in modules.Values) asm.Write(Path.Combine(outputPath, asm.Name)); } }