Skip to content

Commit d388f8c

Browse files
committed
Add support for exported type defintions
1 parent 9af44d5 commit d388f8c

4 files changed

Lines changed: 35 additions & 2 deletions

File tree

Cpp2IL.Core/Model/Contexts/AssemblyAnalysisContext.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ public class AssemblyAnalysisContext : HasCustomAttributesAndName
3030
/// </summary>
3131
public IEnumerable<TypeAnalysisContext> TopLevelTypes => Types.Where(t => t.DeclaringType == null);
3232

33+
/// <summary>
34+
/// The analysis context objects for all types exported by this assembly.
35+
/// </summary>
36+
public IEnumerable<TypeAnalysisContext> ExportedTypes => (Definition?.Image.ExportedTypes ?? []).Select(t => AppContext.ResolveContextForType(t)!);
37+
3338
/// <summary>
3439
/// The code gen module for this assembly.
3540
///
@@ -185,7 +190,7 @@ public AssemblyAnalysisContext(Il2CppAssemblyDefinition? assemblyDefinition, App
185190

186191
InitCustomAttributeData();
187192

188-
foreach (var il2CppTypeDefinition in Definition.Image.Types!)
193+
foreach (var il2CppTypeDefinition in Definition.Image.Types)
189194
{
190195
var typeContext = new TypeAnalysisContext(il2CppTypeDefinition, this);
191196
Types.Add(typeContext);

Cpp2IL.Core/Utils/AsmResolver/AsmResolverAssemblyPopulator.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ public static void ConfigureHierarchy(AssemblyAnalysisContext asmCtx)
4141
foreach (var interfaceType in typeCtx.InterfaceContexts)
4242
typeDefinition.Interfaces.Add(new(interfaceType.ToTypeSignature(typeDefinition.DeclaringModule!).ToTypeDefOrRef()));
4343
}
44+
45+
var assemblyDefinition = asmCtx.GetExtraData<AssemblyDefinition>("AsmResolverAssembly") ?? throw new("AsmResolver assembly not found in assembly analysis context for " + asmCtx);
46+
var moduleDefinition = assemblyDefinition.ManifestModule!;
47+
foreach (var typeCtx in asmCtx.ExportedTypes)
48+
{
49+
var owningAssembly = typeCtx.DeclaringAssembly.GetExtraData<AssemblyDefinition>("AsmResolverAssembly") ?? throw new("AsmResolver assembly not found in assembly analysis context for " + typeCtx.DeclaringAssembly);
50+
moduleDefinition.ExportedTypes.Add(new ExportedType(owningAssembly.ToAssemblyReference(), typeCtx.Namespace, typeCtx.Name));
51+
}
4452
}
4553

4654
private static void PopulateGenericParamsForType(TypeAnalysisContext cppTypeDefinition, TypeDefinition ilTypeDefinition)

LibCpp2IL/Metadata/Il2CppImageDefinition.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,19 @@ public class Il2CppImageDefinition : ReadableClass
2121

2222
public string? Name => OwningContext.Metadata.GetStringFromIndex(nameIndex);
2323

24-
public Il2CppTypeDefinition[]? Types => Enumerable
24+
public Il2CppTypeDefinition[] Types => Enumerable
2525
.Range(firstTypeIndex.Value, (int)typeCount)
2626
.Select(Il2CppVariableWidthIndex<Il2CppTypeDefinition>.MakeTemporaryForFixedWidthUsage) // DynWidth: using Enumerable.Range, not read from file, so making temp is ok
2727
.Select(OwningContext.Metadata.GetTypeDefinitionFromIndex)
2828
.ToArray();
2929

30+
public Il2CppTypeDefinition[]? ExportedTypes => IsAtLeast(24)
31+
? Enumerable
32+
.Range(exportedTypeStart.Value, (int)exportedTypeCount)
33+
.Select(OwningContext.Metadata.GetExportedTypeDefintionFromIndex)
34+
.ToArray()
35+
: null;
36+
3037
public override string ToString()
3138
{
3239
return $"Il2CppImageDefinition[Name={Name}]";

LibCpp2IL/Metadata/Il2CppMetadata.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class Il2CppMetadata : ClassReadingBinaryReader
5252
public Il2CppFieldRef[] fieldRefs;
5353
private Il2CppGenericParameter[] genericParameters;
5454
public Il2CppVariableWidthIndex<Il2CppType>[] constraintIndices;
55+
public int[] exportedTypes;
5556

5657
public int[] referencedAssemblies;
5758

@@ -370,6 +371,16 @@ private Il2CppMetadata(MemoryStream stream, UnityVersion unityVersion, float met
370371
stringLiterals = ReadMetadataClassArray<Il2CppStringLiteral>(metadataHeader.stringLiteral);
371372
LibLogger.VerboseNewline($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");
372373

374+
if (MetadataVersion > 24)
375+
{
376+
LibLogger.Verbose("\tReading exported types...");
377+
start = DateTime.Now;
378+
379+
exportedTypes = ReadClassArrayAtRawAddr<int>(metadataHeader.exportedTypeDefinitions.Offset, metadataHeader.exportedTypeDefinitions.Size / sizeof(int));
380+
381+
LibLogger.VerboseNewline($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");
382+
}
383+
373384
if (MetadataVersion < 24.2f)
374385
{
375386
LibLogger.Verbose("\tReading RGCTX data...");
@@ -685,6 +696,8 @@ internal string ReadStringFromIndexNoReadLock(int index)
685696
}
686697

687698
public Il2CppTypeDefinition GetTypeDefinitionFromIndex(Il2CppVariableWidthIndex<Il2CppTypeDefinition> index) => typeDefs[index.Value];
699+
700+
public Il2CppTypeDefinition GetExportedTypeDefintionFromIndex(int index) => typeDefs[exportedTypes[index]];
688701

689702
public Il2CppGenericContainer GetGenericContainerFromIndex(Il2CppVariableWidthIndex<Il2CppGenericContainer> index) => genericContainers[index.Value];
690703

0 commit comments

Comments
 (0)