DLL: Forward declare all assemblies
This commit is contained in:
@@ -7,13 +7,11 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using dnlib.DotNet;
|
using dnlib.DotNet;
|
||||||
using dnlib.DotNet.Emit;
|
using dnlib.DotNet.Emit;
|
||||||
using Il2CppInspector.Reflection;
|
using Il2CppInspector.Reflection;
|
||||||
using Assembly = System.Reflection.Assembly;
|
|
||||||
using BindingFlags = System.Reflection.BindingFlags;
|
using BindingFlags = System.Reflection.BindingFlags;
|
||||||
|
|
||||||
namespace Il2CppInspector.Outputs
|
namespace Il2CppInspector.Outputs
|
||||||
@@ -70,7 +68,7 @@ namespace Il2CppInspector.Outputs
|
|||||||
private const string rootNamespace = "Il2CppInspector.DLL";
|
private const string rootNamespace = "Il2CppInspector.DLL";
|
||||||
|
|
||||||
// All modules (single-module assemblies)
|
// All modules (single-module assemblies)
|
||||||
private List<ModuleDef> modules = new List<ModuleDef>();
|
private Dictionary<Assembly, ModuleDef> modules = new Dictionary<Assembly, ModuleDef>();
|
||||||
|
|
||||||
public AssemblyShims(TypeModel model) => this.model = model;
|
public AssemblyShims(TypeModel model) => this.model = model;
|
||||||
|
|
||||||
@@ -133,7 +131,7 @@ namespace Il2CppInspector.Outputs
|
|||||||
var module = new ModuleDefUser(name) { Kind = ModuleKind.Dll };
|
var module = new ModuleDefUser(name) { Kind = ModuleKind.Dll };
|
||||||
|
|
||||||
// Create assembly
|
// 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);
|
var asm = new AssemblyDefUser(name.Replace(".dll", ""), ourVersion);
|
||||||
|
|
||||||
// Add module to assembly
|
// Add module to assembly
|
||||||
@@ -454,7 +452,7 @@ namespace Il2CppInspector.Outputs
|
|||||||
return new ByRefSig(GetTypeSig(module, type.ElementType));
|
return new ByRefSig(GetTypeSig(module, type.ElementType));
|
||||||
|
|
||||||
// Get module that owns the type
|
// 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);
|
var typeOwnerModuleRef = new ModuleRefUser(typeOwnerModule);
|
||||||
|
|
||||||
// Get reference to type; use nested type as resolution scope if applicable
|
// 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
|
// We have to do this before adding anything else so we can reference every type
|
||||||
modules.Clear();
|
modules.Clear();
|
||||||
|
|
||||||
|
// Create all assemblies
|
||||||
foreach (var asm in model.Assemblies) {
|
foreach (var asm in model.Assemblies) {
|
||||||
// Create assembly and add primary module to list
|
// Create assembly and add primary module to list
|
||||||
var module = CreateAssembly(asm.ShortName);
|
var module = CreateAssembly(asm.ShortName);
|
||||||
modules.Add(module);
|
modules.Add(asm, 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
// Write all assemblies to disk
|
||||||
foreach (var asm in modules)
|
foreach (var asm in modules.Values)
|
||||||
asm.Write(Path.Combine(outputPath, asm.Name));
|
asm.Write(Path.Combine(outputPath, asm.Name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user