Skip to content

Commit f560747

Browse files
committed
NativeAPI - add free functions and remove useless unsafe
1 parent 93c019f commit f560747

1 file changed

Lines changed: 47 additions & 11 deletions

File tree

TypeTreeGeneratorAPI/NativeAPI.cs

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
using System.Runtime.InteropServices;
1+
using AssetStudio;
2+
using System.Runtime.InteropServices;
23

34
namespace TypeTreeGeneratorAPI
45
{
56
public static class NativeAPI
67
{
78
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_init")]
8-
unsafe public static IntPtr TypeTreeGenerator_create(IntPtr unityVersionPtr)
9+
public static IntPtr TypeTreeGenerator_create(IntPtr unityVersionPtr)
910
{
1011
string? unityVersion = Marshal.PtrToStringUTF8(unityVersionPtr);
1112
if (unityVersion == null)
@@ -103,7 +104,7 @@ public static int TypeTreeGenerator_delete(IntPtr typeTreeGeneratorPtr)
103104
}
104105

105106
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_generateTreeNodesJson")]
106-
unsafe public static int TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr jsonAddr, IntPtr jsonLength)
107+
public static int TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr jsonAddr, IntPtr jsonLength)
107108
{
108109
string? assemblyName = Marshal.PtrToStringUTF8(assemblyNamePtr);
109110
string? fullName = Marshal.PtrToStringUTF8(fullNamePtr);
@@ -143,8 +144,8 @@ unsafe public static int TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr type
143144
}
144145

145146
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_generateTreeNodesRaw")]
146-
unsafe public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
147-
{
147+
public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
148+
{
148149
string? assemblyName = Marshal.PtrToStringUTF8(assemblyNamePtr);
149150
string? fullName = Marshal.PtrToStringUTF8(fullNamePtr);
150151

@@ -154,7 +155,7 @@ unsafe public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeT
154155
}
155156
try
156157
{
157-
var typeTreeGenerator = (TypeTreeGenerator)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
158+
var typeTreeGenerator = (TypeTreeGenerator)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
158159
var typeTreeNodes = typeTreeGenerator.GenerateTreeNodes(assemblyName, fullName);
159160
if (typeTreeNodes == null)
160161
{
@@ -173,10 +174,25 @@ unsafe public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeT
173174
}
174175
}
175176

177+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_freeTreeNodesRaw")]
178+
public static int TypeTreeGenerator_freeTreeNodesRaw(IntPtr arrAddr, int arrLength)
179+
{
180+
if (arrAddr == IntPtr.Zero)
181+
{
182+
return -1;
183+
}
184+
for (int i = 0; i < arrLength; i++)
185+
{
186+
Marshal.DestroyStructure<TypeTreeNode>(arrAddr + i * Marshal.SizeOf<TypeTreeNode>());
187+
}
188+
Marshal.FreeCoTaskMem(arrAddr);
189+
return 0;
190+
}
191+
176192
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_getMonoBehaviorDefinitions")]
177-
unsafe public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
178-
{
179-
if (typeTreeGeneratorPtr == IntPtr.Zero )
193+
public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
194+
{
195+
if (typeTreeGeneratorPtr == IntPtr.Zero)
180196
{
181197
return -1;
182198
}
@@ -187,15 +203,15 @@ unsafe public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typ
187203
var typeNames = typeTreeGenerator.GetMonoBehaviourDefinitions();
188204

189205
var arrayLength = typeNames.Count;
190-
var arrayPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf<IntPtr>() * arrayLength * 2);
206+
var arrayPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf<IntPtr>() * arrayLength * 2);
191207
for (int i = 0; i < arrayLength; i++)
192208
{
193209
string module = typeNames[i].Module.Name;
194210
string fullName = typeNames[i].FullName;
195211
Marshal.WriteIntPtr(arrayPtr, (i * 2) * Marshal.SizeOf<IntPtr>(), Marshal.StringToCoTaskMemUTF8(module));
196212
Marshal.WriteIntPtr(arrayPtr, (i * 2 + 1) * Marshal.SizeOf<IntPtr>(), Marshal.StringToCoTaskMemUTF8(fullName));
197213
}
198-
214+
199215
Marshal.WriteIntPtr(arrAddrPtr, arrayPtr);
200216
Marshal.WriteInt32(arrLengthPtr, arrayLength);
201217

@@ -206,6 +222,26 @@ unsafe public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typ
206222
return -1;
207223
}
208224
}
225+
226+
227+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_freeMonoBehaviorDefinitions")]
228+
public static int TypeTreeGenerator_freeMonoBehaviorDefinitions(IntPtr arrAddr, int arrLength)
229+
{
230+
if (arrAddr == IntPtr.Zero)
231+
{
232+
return -1;
233+
}
234+
for (int i = 0; i < arrLength; i++)
235+
{
236+
var modulePtr = Marshal.ReadIntPtr(arrAddr, i * IntPtr.Size * 2);
237+
var fullNamePtr = Marshal.ReadIntPtr(arrAddr, i * IntPtr.Size * 2 + IntPtr.Size);
238+
Marshal.FreeCoTaskMem(modulePtr);
239+
Marshal.FreeCoTaskMem(fullNamePtr);
240+
}
241+
Marshal.FreeCoTaskMem(arrAddr);
242+
return 0;
243+
}
244+
209245
[UnmanagedCallersOnly(EntryPoint = "FreeCoTaskMem")]
210246
public static void FreeCoTaskMem(IntPtr ptr)
211247
{

0 commit comments

Comments
 (0)