Skip to content

Commit 1f3d664

Browse files
committed
feat: implement GetAssemblyNames, print errors on native api, fix some warnings
1 parent 55574fb commit 1f3d664

6 files changed

Lines changed: 76 additions & 14 deletions

File tree

TypeTreeGeneratorAPI/NativeAPI.cs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Runtime.InteropServices;
1+
using System.Reflection;
2+
using System.Runtime.InteropServices;
23
using TypeTreeGeneratorAPI.TypeTreeGenerator;
34

45
namespace TypeTreeGeneratorAPI
@@ -21,11 +22,11 @@ public static IntPtr TypeTreeGenerator_create(IntPtr unityVersionPtr, IntPtr gen
2122
}
2223
catch (Exception ex)
2324
{
24-
Console.WriteLine($"Error creating TypeTreeGenerator: {ex.Message}");
25+
Console.WriteLine($"Error creating TypeTreeGenerator:\n{ex.Message}");
2526
// If the generator type is not recognized, we return IntPtr.Zero to indicate failure.
2627
// This should be handled by the caller to avoid further issues.
2728
Console.WriteLine("Failed to create TypeTreeGenerator instance. Ensure the generator name is correct and supported.");
28-
return IntPtr.Zero;
29+
return IntPtr.Zero;
2930
}
3031
}
3132

@@ -49,8 +50,9 @@ unsafe public static int TypeTreeGenerator_loadDLL(IntPtr typeTreeGeneratorPtr,
4950
}
5051
return 0;
5152
}
52-
catch
53+
catch (Exception ex)
5354
{
55+
Console.WriteLine($"Error loading dll:\n{ex.Message}");
5456
return -1;
5557
}
5658
}
@@ -82,8 +84,9 @@ unsafe public static int TypeTreeGenerator_loadIL2CPP(IntPtr typeTreeGeneratorPt
8284
handle.Instance.LoadIl2Cpp(assemblyData, metadataData);
8385
return 0;
8486
}
85-
catch
87+
catch (Exception ex)
8688
{
89+
Console.WriteLine($"Error loading il2cpp:\n{ex.Message}");
8790
return -1;
8891
}
8992
}
@@ -102,12 +105,30 @@ public static int TypeTreeGenerator_delete(IntPtr typeTreeGeneratorPtr)
102105
gch.Free();
103106
return 0;
104107
}
105-
catch
108+
catch (Exception ex)
106109
{
110+
Console.WriteLine($"Error deleting TypeTreeGenerator:\n{ex.Message}");
107111
return -1;
108112
}
109113
}
110114

115+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_getLoadedDLLNames")]
116+
public static IntPtr TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr typeTreeGeneratorPtr)
117+
{
118+
if (typeTreeGeneratorPtr == IntPtr.Zero)
119+
{
120+
return 0;
121+
}
122+
var handle = (TypeTreeGeneratorHandle)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
123+
var names = handle.Instance.GetAssemblyNames();
124+
if (names == null || names.Count == 0)
125+
{
126+
return 0;
127+
}
128+
var json = string.Join(",", names.Select(name => $"\"{name}\""));
129+
return Marshal.StringToCoTaskMemUTF8($"[{json}]");
130+
}
131+
111132
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_generateTreeNodesJson")]
112133
public static int TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr jsonAddr)
113134
{
@@ -131,8 +152,9 @@ public static int TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr typeTreeGen
131152
Marshal.WriteIntPtr(jsonAddr, Marshal.StringToCoTaskMemUTF8(json));
132153
return 0;
133154
}
134-
catch
155+
catch (Exception ex)
135156
{
157+
Console.WriteLine($"Error generating tree nodes:\n{ex.Message}");
136158
return -1;
137159
}
138160
}
@@ -162,8 +184,9 @@ public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeTreeGene
162184

163185
return 0;
164186
}
165-
catch
187+
catch (Exception ex)
166188
{
189+
Console.WriteLine($"Error generating tree nodes:\n{ex.Message}");
167190
return -1;
168191
}
169192
}
@@ -211,8 +234,9 @@ public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGe
211234

212235
return 0;
213236
}
214-
catch
237+
catch (Exception ex)
215238
{
239+
Console.WriteLine($"Error geting mono behaviour definitions:\n{ex.Message}");
216240
return -1;
217241
}
218242
}

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetRipper/AssetRipper.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ public AssetRipperGenerator(string unityVersionString) : base(unityVersionString
2828

2929

3030
var type = FindType(assemblyName, nameSpace, className);
31-
var monoType = default(SerializableType?);
32-
string? failureReason = null;
33-
if (!new FieldSerializer(new UnityVersion(6000)).TryCreateSerializableType(type, monoTypeCache, out monoType, out failureReason))
31+
if (type == null)
32+
{
33+
return null;
34+
}
35+
if (!new FieldSerializer(new UnityVersion(6000)).TryCreateSerializableType(type, monoTypeCache, out SerializableType? monoType, out string? failureReason))
3436
{
3537
throw new InvalidOperationException($"Failed to create SerializableType: {failureReason}");
3638
}
@@ -43,6 +45,10 @@ public AssetRipperGenerator(string unityVersionString) : base(unityVersionString
4345
var monoBehaviourDefinitions = new List<(string, string)>();
4446
foreach (var assembly in assemblyDefinitions.Values)
4547
{
48+
if (assembly.Name is null)
49+
{
50+
continue;
51+
}
4652
foreach (var module in assembly.Modules)
4753
{
4854
foreach (var type in module.TopLevelTypes)
@@ -119,5 +125,10 @@ private void loadAssembly(AssemblyDefinition assembly)
119125

120126
return null;
121127
}
128+
129+
public override List<string> GetAssemblyNames()
130+
{
131+
return assemblyDefinitions.Keys.ToList();
132+
}
122133
}
123134
}

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetStudio/AssetStudioGenerator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,10 @@ private List<TypeTreeNode> GenerateTreeNodes(TypeDefinition typeDef)
108108
}
109109
return null;
110110
}
111+
112+
public override List<string> GetAssemblyNames()
113+
{
114+
return [.. moduleDic.Keys];
115+
}
111116
}
112117
}

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetStudio/AssetStudioUtility/TypeDefinitionConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private FieldReference ResolveGenericFieldReference(FieldReference fieldRef)
104104
return TypeDef.Module.ImportReference(field);
105105
}
106106

107-
private TypeReference ResolveDeclaringType(TypeReference declaringType)
107+
private TypeReference? ResolveDeclaringType(TypeReference declaringType)
108108
{
109109
var typeDefinition = declaringType.Resolve();
110110
if (typeDefinition == null || !typeDefinition.HasGenericParameters)

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetsTools/AssetsToolsGenerator.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,12 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
139139
}
140140
foreach (var asmDef in LibCpp2IlMain.TheMetadata.AssemblyDefinitions)
141141
{
142-
if (asmDef.Image.Types == null)
142+
if (asmDef.Image.Types == null || asmDef.AssemblyName.Name is null)
143143
continue;
144144
foreach (var asmType in asmDef.Image.Types)
145145
{
146+
if (asmType.FullName is null)
147+
continue;
146148
var baseType = asmType.BaseType?.baseType;
147149
while (baseType != null)
148150
{
@@ -179,5 +181,23 @@ private static bool IsMonoBehaviour(TypeDefinition type)
179181
}
180182
return false;
181183
}
184+
185+
public override List<string> GetAssemblyNames()
186+
{
187+
if (monoLoaded && monoCecilGenerator != null)
188+
{
189+
return monoCecilGenerator.loadedAssemblies.Keys.ToList();
190+
}
191+
else if (LibCpp2IlMain.TheMetadata != null)
192+
{
193+
return LibCpp2IlMain.TheMetadata.AssemblyDefinitions
194+
.Select(asmDef => asmDef.AssemblyName.Name)
195+
.ToList();
196+
}
197+
else
198+
{
199+
return new List<string>();
200+
}
201+
}
182202
}
183203
}

TypeTreeGeneratorAPI/TypeTreeGenerator/TypeTreeGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public TypeTreeGenerator(string unityVersionString)
1717
abstract public List<(string, string)> GetMonoBehaviourDefinitions();
1818
abstract public List<TypeTreeNode>? GenerateTreeNodes(string assemblyName, string fullName);
1919

20+
abstract public List<string> GetAssemblyNames();
21+
2022
abstract public void LoadDll(Stream dllStream);
2123

2224
virtual public void LoadDll(byte[] dll)

0 commit comments

Comments
 (0)