1- using System . Runtime . InteropServices ;
1+ using AssetStudio ;
2+ using System . Runtime . InteropServices ;
23
34namespace 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