22using AsmResolver . PE . Builder ;
33using AssetRipper . Primitives ;
44using AssetStudio ;
5- using Cpp2IL . Core . OutputFormats ;
65using Cpp2IL . Core ;
6+ using Cpp2IL . Core . OutputFormats ;
77using Mono . Cecil ;
88using System . Diagnostics . CodeAnalysis ;
99
1010namespace TypeTreeGeneratorAPI
1111{
12- public class TypeTreeGenerator
12+ abstract public class TypeTreeGenerator
1313 {
14- private Dictionary < string , ModuleDefinition > moduleDic ;
15- private MyAssemblyResolver resolver ;
16- private ReaderParameters readerParameters ;
17- private string unityVersion ;
18- private SerializedTypeHelper serializedTypeHelper ;
14+ protected readonly string unityVersionString ;
15+ protected readonly UnityVersion unityVersion ;
16+ protected readonly MyAssemblyResolver resolver ;
17+ protected readonly ReaderParameters readerParameters ;
1918
2019 public TypeTreeGenerator ( string unityVersion )
2120 {
22- this . unityVersion = unityVersion ;
23- moduleDic = new Dictionary < string , ModuleDefinition > ( ) ;
24- resolver = new MyAssemblyResolver ( ) ;
25- readerParameters = new ReaderParameters ( ) ;
26- readerParameters . InMemory = true ;
27- readerParameters . ReadWrite = false ;
28- readerParameters . AssemblyResolver = resolver ;
21+ this . unityVersionString = unityVersion ;
22+ this . unityVersion = UnityVersion . Parse ( unityVersionString ) ;
2923
30- var arVersion = UnityVersion . Parse ( unityVersion ) ;
31- serializedTypeHelper = new SerializedTypeHelper ( [ arVersion . Major , arVersion . Minor , arVersion . Build , arVersion . TypeNumber ] ) ;
32- }
33-
34- ~ TypeTreeGenerator ( )
35- {
36- foreach ( var pair in moduleDic )
24+ resolver = new MyAssemblyResolver ( ) ;
25+ readerParameters = new ReaderParameters
3726 {
38- pair . Value . Dispose ( ) ;
39- }
40- moduleDic . Clear ( ) ;
27+ InMemory = true ,
28+ ReadWrite = false ,
29+ AssemblyResolver = resolver
30+ } ;
4131 }
4232
33+
34+ abstract public List < Tuple < string , string > > GetMonoBehaviourDefinitions ( ) ;
35+ abstract public List < TypeTreeNode > ? GenerateTreeNodes ( string assemblyName , string fullName ) ;
36+ abstract public void LoadDLL ( Stream dllStream ) ;
37+
4338 public void LoadDLL ( byte [ ] dll )
4439 {
4540 using ( var dllStream = new MemoryStream ( dll ) )
@@ -48,19 +43,12 @@ public void LoadDLL(byte[] dll)
4843 }
4944 }
5045
51- public void LoadDLL ( Stream dllStream )
52- {
53- var assembly = AssemblyDefinition . ReadAssembly ( dllStream , readerParameters ) ;
54- resolver . Register ( assembly ) ;
55- moduleDic . Add ( assembly . MainModule . Name , assembly . MainModule ) ;
56- }
57-
5846 [ UnconditionalSuppressMessage ( "Trimming" , "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code" , Justification = "<Pending>" ) ]
5947 public void LoadIL2CPP ( byte [ ] assemblyData , byte [ ] metadataData )
6048 {
6149 Cpp2IlApi . Init ( ) ;
6250 Cpp2IlApi . ConfigureLib ( false ) ;
63- Cpp2IlApi . InitializeLibCpp2Il ( assemblyData , metadataData , UnityVersion . Parse ( unityVersion ) , false ) ;
51+ Cpp2IlApi . InitializeLibCpp2Il ( assemblyData , metadataData , this . unityVersion , false ) ;
6452
6553 var dllGen = new AsmResolverDllOutputFormatEmpty ( ) ;
6654
@@ -80,61 +68,26 @@ public void LoadIL2CPP(byte[] assemblyData, byte[] metadataData)
8068 Cpp2IlPluginManager . CallOnFinish ( ) ;
8169 }
8270
83- public List < TypeDefinition > GetMonoBehaviourDefinitions ( )
71+ protected static bool IsMonoBehaviour ( TypeDefinition type )
8472 {
85- var monoBehaviourDefs = new List < TypeDefinition > ( ) ;
86- foreach ( var ( name , module ) in moduleDic )
73+ while ( type != null )
8774 {
88- foreach ( var type in module . Types )
75+ if ( type . BaseType == null )
76+ return false ;
77+ if ( type . BaseType . FullName == "UnityEngine.MonoBehaviour" )
78+ return true ;
79+ try
8980 {
90- if ( type . BaseType ? . FullName == "UnityEngine.MonoBehaviour" )
91- {
92- monoBehaviourDefs . Add ( type ) ;
93- }
81+ // Resolve the base type to continue up the hierarchy
82+ type = type . BaseType . Resolve ( ) ;
9483 }
95- }
96- return monoBehaviourDefs ;
97- }
98-
99- public TypeDefinition ? GetTypeDefinition ( string assemblyName , string fullName )
100- {
101- if ( moduleDic . TryGetValue ( assemblyName , out var module ) )
102- {
103- var typeDef = module . GetType ( fullName ) ;
104- if ( typeDef == null && assemblyName == "UnityEngine.dll" )
84+ catch
10585 {
106- foreach ( var pair in moduleDic )
107- {
108- typeDef = pair . Value . GetType ( fullName ) ;
109- if ( typeDef != null )
110- {
111- break ;
112- }
113- }
86+ // If we can't resolve, break out
87+ break ;
11488 }
115- return typeDef ;
11689 }
117- return null ;
118- }
119-
120- public List < TypeTreeNode > ? GenerateTreeNodes ( string assemblyName , string fullName )
121- {
122- var typeDef = GetTypeDefinition ( assemblyName , fullName ) ;
123- if ( typeDef != null )
124- {
125- return GenerateTreeNodes ( typeDef ) ;
126- }
127- return null ;
128- }
129-
130- public List < TypeTreeNode > GenerateTreeNodes ( TypeDefinition typeDef )
131- {
132- // from AssetStudioUtility.MonoBehaviourConverter
133- var m_Nodes = new List < TypeTreeNode > ( ) ;
134- serializedTypeHelper . AddMonoBehaviour ( m_Nodes , 0 ) ;
135- var converter = new TypeDefinitionConverter ( typeDef , serializedTypeHelper , 1 ) ;
136- m_Nodes . AddRange ( converter . ConvertToTypeTreeNodes ( ) ) ;
137- return m_Nodes ;
90+ return false ;
13891 }
13992
14093 }
0 commit comments