Skip to content

Commit 2d508ea

Browse files
committed
2 parents f7516fa + 1f80718 commit 2d508ea

15 files changed

Lines changed: 221 additions & 106 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ bld/
3737
# Uncomment if you have tasks that create the project's static files in wwwroot
3838
#wwwroot/
3939

40+
# Rider
41+
/.idea
42+
4043
# Visual Studio 2017 auto generated files
4144
Generated\ Files/
4245

TypeTreeGeneratorAPI/NativeAPI.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ unsafe public static int TypeTreeGenerator_loadDLL(IntPtr typeTreeGeneratorPtr,
5858
}
5959

6060

61+
#if ENABLE_IL2CPP
6162
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_loadIL2CPP")]
6263
unsafe public static int TypeTreeGenerator_loadIL2CPP(IntPtr typeTreeGeneratorPtr, byte* assemblyDataPtr, int assemblyDataLength, byte* metadataDataPtr, int metadataDataLength)
6364
{
@@ -90,6 +91,7 @@ unsafe public static int TypeTreeGenerator_loadIL2CPP(IntPtr typeTreeGeneratorPt
9091
return -1;
9192
}
9293
}
94+
#endif
9395

9496
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_del")]
9597
public static int TypeTreeGenerator_delete(IntPtr typeTreeGeneratorPtr)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#if ENABLE_IL2CPP || ENABLE_ASSET_RIPPER
2+
namespace TypeTreeGeneratorAPI.TypeTreeGenerator;
3+
4+
public class AssemblyResolver : AsmResolver.DotNet.IAssemblyResolver
5+
{
6+
public Dictionary<string, AsmResolver.DotNet.AssemblyDefinition> assemblyDefinitions = new();
7+
8+
public void AddToCache(string name, AsmResolver.DotNet.AssemblyDefinition definition)
9+
{
10+
assemblyDefinitions[name] = definition;
11+
}
12+
13+
public void AddToCache(AsmResolver.DotNet.AssemblyDescriptor descriptor, AsmResolver.DotNet.AssemblyDefinition definition)
14+
{
15+
assemblyDefinitions[descriptor.Name] = definition;
16+
}
17+
18+
public void ClearCache()
19+
{
20+
assemblyDefinitions.Clear();
21+
}
22+
23+
public bool HasCached(AsmResolver.DotNet.AssemblyDescriptor descriptor)
24+
{
25+
return assemblyDefinitions.ContainsKey(descriptor.Name);
26+
}
27+
28+
public bool RemoveFromCache(AsmResolver.DotNet.AssemblyDescriptor descriptor)
29+
{
30+
return assemblyDefinitions.Remove(descriptor.Name);
31+
}
32+
33+
public AsmResolver.DotNet.AssemblyDefinition? Resolve(AsmResolver.DotNet.AssemblyDescriptor assembly)
34+
{
35+
if (assemblyDefinitions.TryGetValue(assembly.Name, out var assemblyDef))
36+
{
37+
return assemblyDef;
38+
}
39+
return null;
40+
}
41+
}
42+
#endif

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetRipper/AssetRipper.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
using AsmResolver.PE.File;
33
using AssetRipper.Primitives;
44
using AssetRipper.SerializationLogic;
5-
using Cpp2IL.Core.Extensions;
65

76
namespace TypeTreeGeneratorAPI.TypeTreeGenerator.AssetRipper
87
{
98
public class AssetRipperGenerator : TypeTreeGenerator
109
{
1110
protected Dictionary<string, AssemblyDefinition> assemblyDefinitions => assemblyResolver.assemblyDefinitions;
1211
private Dictionary<ITypeDefOrRef, SerializableType> monoTypeCache = new();
13-
private Il2CppHandler.AssemblyResolver assemblyResolver = new();
12+
private AssemblyResolver assemblyResolver = new();
1413
private SerializableTypeConverter typeConverter;
1514

1615
protected override bool supportsIl2Cpp => true;
@@ -26,8 +25,9 @@ public AssetRipperGenerator(string unityVersionString) : base(unityVersionString
2625
var nameSpace = lastDot == -1 ? "" : fullName.Substring(0, lastDot);
2726
var className = lastDot == -1 ? fullName : fullName.Substring(lastDot + 1);
2827

28+
var assemblyNameNormalized = assemblyName.EndsWith(".dll") ? assemblyName[..^".dll".Length] : assemblyName;
2929

30-
var type = FindType(assemblyName, nameSpace, className);
30+
var type = FindType(assemblyNameNormalized, nameSpace, className);
3131
if (type == null)
3232
{
3333
return null;
@@ -65,7 +65,9 @@ public AssetRipperGenerator(string unityVersionString) : base(unityVersionString
6565

6666
public override void LoadDll(Stream dllStream)
6767
{
68-
LoadDll(dllStream.ReadBytes());
68+
using var ms = new MemoryStream();
69+
dllStream.CopyTo(ms);
70+
LoadDll(ms.ToArray());
6971
}
7072

7173
public override void LoadDll(byte[] dllData)
@@ -75,6 +77,7 @@ public override void LoadDll(byte[] dllData)
7577
loadAssembly(assembly);
7678
}
7779

80+
#if ENABLE_IL2CPP
7881
public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
7982
{
8083
base.LoadIl2Cpp(assemblyData, metadataData);
@@ -83,6 +86,7 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
8386
loadAssembly(assembly);
8487
}
8588
}
89+
#endif
8690

8791
private void loadAssembly(AssemblyDefinition assembly)
8892
{

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetStudio/AssetStudioGenerator.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ public override void LoadDll(Stream dllStream)
4545

4646
public override List<TypeTreeNode>? GenerateTreeNodes(string assemblyName, string fullName)
4747
{
48-
var typeDef = GetTypeDefinition(assemblyName, fullName);
48+
var assemblyNameNormalized = assemblyName.EndsWith(".dll") ? assemblyName : $"{assemblyName}.dll";
49+
50+
var typeDef = GetTypeDefinition(assemblyNameNormalized, fullName);
4951
if (typeDef != null)
5052
{
5153
return GenerateTreeNodes(typeDef);
@@ -55,12 +57,8 @@ public override void LoadDll(Stream dllStream)
5557

5658
private List<TypeTreeNode> GenerateTreeNodes(TypeDefinition typeDef)
5759
{
58-
// from AssetStudioUtility.MonoBehaviourConverter
59-
var m_Nodes = new List<TypeTreeNode>();
60-
serializedTypeHelper.AddMonoBehaviour(m_Nodes, 0);
6160
var converter = new TypeDefinitionConverter(typeDef, serializedTypeHelper, 1);
62-
m_Nodes.AddRange(converter.ConvertToTypeTreeNodes());
63-
return m_Nodes;
61+
return converter.ConvertToTypeTreeNodes();
6462
}
6563

6664
private TypeDefinition? GetTypeDefinition(string assemblyName, string fullName)

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetStudio/AssetStudioUtility/SerilizedTypeHelper.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,6 @@ public SerializedTypeHelper(int[] version)
99
this.version = version;
1010
}
1111

12-
public void AddMonoBehaviour(List<TypeTreeNode> nodes, int indent)
13-
{
14-
nodes.Add(new TypeTreeNode("MonoBehaviour", "Base", indent, false));
15-
AddPPtr(nodes, "GameObject", "m_GameObject", indent + 1);
16-
nodes.Add(new TypeTreeNode("UInt8", "m_Enabled", indent + 1, true));
17-
AddPPtr(nodes, "MonoScript", "m_Script", indent + 1);
18-
AddString(nodes, "m_Name", indent + 1);
19-
}
20-
2112
public void AddPPtr(List<TypeTreeNode> nodes, string type, string name, int indent)
2213
{
2314
nodes.Add(new TypeTreeNode($"PPtr<{type}>", name, indent, false));

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetsTools/AssetsToolsGenerator.cs

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
using AssetsTools.NET;
22
using AssetsTools.NET.Extra;
3-
using LibCpp2IL;
43
using Mono.Cecil;
4+
#if ENABLE_IL2CPP
5+
using LibCpp2IL;
6+
#endif
57

68
namespace TypeTreeGeneratorAPI.TypeTreeGenerator.AssetsTools
79
{
810
public class AssetsToolsGenerator : TypeTreeGenerator
911
{
1012
protected UnityVersion unityVersionExtra;
1113
protected MonoCecilTempGeneratorPatch monoCecilGenerator = new();
14+
#if ENABLE_IL2CPP
1215
protected Cpp2IlTempGeneratorPatch cpp2IlGenerator = new();
16+
#endif
1317
protected readonly MonoCecilResolver resolver = new();
1418
protected override bool supportsIl2Cpp => true;
1519
private bool monoLoaded = false;
1620

1721
public AssetsToolsGenerator(string unityVersionString) : base(unityVersionString)
1822
{
1923
unityVersionExtra = new UnityVersion(unityVersionString);
24+
#if ENABLE_IL2CPP
2025
cpp2IlGenerator.SetUnityVersion(unityVersionExtra);
26+
#endif
2127
}
2228

2329
~AssetsToolsGenerator()
2430
{
2531
monoCecilGenerator.Dispose();
32+
#if ENABLE_IL2CPP
2633
cpp2IlGenerator.Dispose();
34+
#endif
2735
}
2836

2937
public override List<TypeTreeNode>? GenerateTreeNodes(string assemblyName, string fullName)
@@ -53,7 +61,18 @@ public AssetsToolsGenerator(string unityVersionString) : base(unityVersionString
5361
Children = new List<AssetTypeTemplateField>(0)
5462
};
5563

56-
IMonoBehaviourTemplateGeneratorPatch monoTemplateGenerator = monoLoaded ? monoCecilGenerator : cpp2IlGenerator;
64+
65+
IMonoBehaviourTemplateGeneratorPatch monoTemplateGenerator;
66+
if (monoLoaded) {
67+
monoTemplateGenerator = monoCecilGenerator;
68+
} else {
69+
#if ENABLE_IL2CPP
70+
monoTemplateGenerator = cpp2IlGenerator;
71+
#else
72+
monoTemplateGenerator = monoCecilGenerator;
73+
#endif
74+
}
75+
5776
var field = monoTemplateGenerator.GetTemplateFieldPatch(templateField, assemblyName, nameSpace, className, unityVersionExtra);
5877

5978
return field == null ? null : ConvertAssetTypeTemplateFieldIntoTypeTreeNode(field);
@@ -90,22 +109,26 @@ public override void LoadDll(Stream dllStream)
90109
monoCecilGenerator.loadedAssemblies.Add(assembly.MainModule.Name, assembly);
91110
}
92111

112+
#if ENABLE_IL2CPP
93113
public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
94114
{
95115
base.LoadIl2Cpp(assemblyData, metadataData);
96116
cpp2IlGenerator.SetInitialized(true);
97117
}
118+
#endif
98119

99120
public override List<(string, string)> GetClassDefinitions()
100121
{
101122
if (monoLoaded)
102123
{
103124
return GetClassDefinitions_Mono();
104125
}
126+
#if ENABLE_IL2CPP
105127
else if (LibCpp2IlMain.TheMetadata != null)
106128
{
107129
return GetClassDefinitions_Il2Cpp();
108130
}
131+
#endif
109132
else
110133
{
111134
// TODO - err
@@ -126,7 +149,8 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
126149
return typedefs;
127150
}
128151

129-
public List<(string, string)> GetClassDefinitions_Il2Cpp()
152+
#if ENABLE_IL2CPP
153+
public List<(string, string)> GetMonoBehaviourDefinitions_Il2Cpp()
130154
{
131155
var typedefs = new List<(string, string)>();
132156
if (LibCpp2IlMain.TheMetadata == null)
@@ -145,7 +169,29 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
145169
typedefs.Add((asmDef.AssemblyName.Name, asmType.FullName));
146170
}
147171
}
148-
return typedefs;
172+
return monoBehaviourDefs;
173+
}
174+
175+
private static bool IsMonoBehaviour(TypeDefinition type)
176+
{
177+
while (type != null)
178+
{
179+
if (type.BaseType == null)
180+
return false;
181+
if (type.BaseType.FullName == "UnityEngine.MonoBehaviour")
182+
return true;
183+
try
184+
{
185+
// Resolve the base type to continue up the hierarchy
186+
type = type.BaseType.Resolve();
187+
}
188+
catch
189+
{
190+
// If we can't resolve, break out
191+
break;
192+
}
193+
}
194+
return false;
149195
}
150196

151197
public override List<string> GetAssemblyNames()
@@ -154,12 +200,14 @@ public override List<string> GetAssemblyNames()
154200
{
155201
return monoCecilGenerator.loadedAssemblies.Keys.ToList();
156202
}
203+
#if ENABLE_IL2CPP
157204
else if (LibCpp2IlMain.TheMetadata != null)
158205
{
159206
return LibCpp2IlMain.TheMetadata.AssemblyDefinitions
160207
.Select(asmDef => asmDef.AssemblyName.Name)
161208
.ToList();
162209
}
210+
#endif
163211
else
164212
{
165213
return new List<string>();

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetsTools/MonoBehaviourTemplateGeneratorPatch.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using AssetsTools.NET;
2-
using AssetsTools.NET.Cpp2IL;
32
using AssetsTools.NET.Extra;
3+
#if ENABLE_IL2CPP
4+
using AssetsTools.NET.Cpp2IL;
45
using System.Reflection;
6+
#endif
57

68
namespace TypeTreeGeneratorAPI.TypeTreeGenerator.AssetsTools
79
{
@@ -13,6 +15,7 @@ virtual AssetTypeTemplateField GetTemplateFieldPatch(AssetTypeTemplateField temp
1315
}
1416
}
1517

18+
#if ENABLE_IL2CPP
1619
public class Cpp2IlTempGeneratorPatch : Cpp2IlTempGenerator, IMonoBehaviourTemplateGeneratorPatch
1720
{
1821
public Cpp2IlTempGeneratorPatch() : base("", "")
@@ -33,6 +36,7 @@ public void SetInitialized(bool initialized)
3336
}
3437
}
3538
}
39+
#endif
3640

3741
public class MonoCecilTempGeneratorPatch : MonoCecilTempGenerator, IMonoBehaviourTemplateGeneratorPatch
3842
{

TypeTreeGeneratorAPI/TypeTreeGenerator/Il2CppHandler.cs

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
using AssetRipper.Primitives;
1+
#if ENABLE_IL2CPP
2+
using AssetRipper.Primitives;
23
using Cpp2IL.Core;
34
using Cpp2IL.Core.Api;
4-
using Cpp2IL.Core.InstructionSets;
55
using Cpp2IL.Core.OutputFormats;
66
using Cpp2IL.Core.ProcessingLayers;
7-
using LibCpp2IL;
87

98
namespace TypeTreeGeneratorAPI.TypeTreeGenerator
109
{
@@ -54,43 +53,7 @@ public static void Initialize(byte[] assemblyData, byte[] metadataData, string u
5453
return assemblyResolver.assemblyDefinitions;
5554
}
5655

57-
public class AssemblyResolver : AsmResolver.DotNet.IAssemblyResolver
58-
{
59-
public Dictionary<string, AsmResolver.DotNet.AssemblyDefinition> assemblyDefinitions = new();
60-
61-
public void AddToCache(string name, AsmResolver.DotNet.AssemblyDefinition definition)
62-
{
63-
assemblyDefinitions[name] = definition;
64-
}
65-
66-
public void AddToCache(AsmResolver.DotNet.AssemblyDescriptor descriptor, AsmResolver.DotNet.AssemblyDefinition definition)
67-
{
68-
assemblyDefinitions[descriptor.Name] = definition;
69-
}
70-
71-
public void ClearCache()
72-
{
73-
assemblyDefinitions.Clear();
74-
}
75-
76-
public bool HasCached(AsmResolver.DotNet.AssemblyDescriptor descriptor)
77-
{
78-
return assemblyDefinitions.ContainsKey(descriptor.Name);
79-
}
80-
81-
public bool RemoveFromCache(AsmResolver.DotNet.AssemblyDescriptor descriptor)
82-
{
83-
return assemblyDefinitions.Remove(descriptor.Name);
84-
}
85-
86-
public AsmResolver.DotNet.AssemblyDefinition? Resolve(AsmResolver.DotNet.AssemblyDescriptor assembly)
87-
{
88-
if (assemblyDefinitions.TryGetValue(assembly.Name, out var assemblyDef))
89-
{
90-
return assemblyDef;
91-
}
92-
return null;
93-
}
94-
}
56+
9557
}
9658
}
59+
#endif

0 commit comments

Comments
 (0)