Skip to content

Commit afb28b5

Browse files
jakobhellermannK0lb3
authored andcommitted
compile features: make IL2CPP support configurable
1 parent ac767fd commit afb28b5

8 files changed

Lines changed: 104 additions & 49 deletions

File tree

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: 6 additions & 3 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;
@@ -66,7 +65,9 @@ public AssetRipperGenerator(string unityVersionString) : base(unityVersionString
6665

6766
public override void LoadDll(Stream dllStream)
6867
{
69-
LoadDll(dllStream.ReadBytes());
68+
using var ms = new MemoryStream();
69+
dllStream.CopyTo(ms);
70+
LoadDll(ms.ToArray());
7071
}
7172

7273
public override void LoadDll(byte[] dllData)
@@ -76,6 +77,7 @@ public override void LoadDll(byte[] dllData)
7677
loadAssembly(assembly);
7778
}
7879

80+
#if ENABLE_IL2CPP
7981
public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
8082
{
8183
base.LoadIl2Cpp(assemblyData, metadataData);
@@ -84,6 +86,7 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
8486
loadAssembly(assembly);
8587
}
8688
}
89+
#endif
8790

8891
private void loadAssembly(AssemblyDefinition assembly)
8992
{

TypeTreeGeneratorAPI/TypeTreeGenerator/AssetsTools/AssetsToolsGenerator.cs

Lines changed: 29 additions & 2 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)> GetMonoBehaviourDefinitions()
100121
{
101122
if (monoLoaded)
102123
{
103124
return GetMonoBehaviourDefinitions_Mono();
104125
}
126+
#if ENABLE_IL2CPP
105127
else if (LibCpp2IlMain.TheMetadata != null)
106128
{
107129
return GetMonoBehaviourDefinitions_Il2Cpp();
108130
}
131+
#endif
109132
else
110133
{
111134
// TODO - err
@@ -129,6 +152,7 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
129152
return monoBehaviourDefs;
130153
}
131154

155+
#if ENABLE_IL2CPP
132156
public List<(string, string)> GetMonoBehaviourDefinitions_Il2Cpp()
133157
{
134158
var monoBehaviourDefs = new List<(string, string)>();
@@ -159,6 +183,7 @@ public override void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
159183
}
160184
return monoBehaviourDefs;
161185
}
186+
#endif
162187

163188
private static bool IsMonoBehaviour(TypeDefinition type)
164189
{
@@ -188,12 +213,14 @@ public override List<string> GetAssemblyNames()
188213
{
189214
return monoCecilGenerator.loadedAssemblies.Keys.ToList();
190215
}
216+
#if ENABLE_IL2CPP
191217
else if (LibCpp2IlMain.TheMetadata != null)
192218
{
193219
return LibCpp2IlMain.TheMetadata.AssemblyDefinitions
194220
.Select(asmDef => asmDef.AssemblyName.Name)
195221
.ToList();
196222
}
223+
#endif
197224
else
198225
{
199226
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

TypeTreeGeneratorAPI/TypeTreeGenerator/TypeTreeGenerator.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ virtual public void LoadDll(byte[] dll)
2828
LoadDll(dllStream);
2929
}
3030
}
31+
32+
#if ENABLE_IL2CPP
3133
public virtual void LoadIl2Cpp(byte[] assemblyData, byte[] metadataData)
3234
{
3335
Il2CppHandler.Initialize(assemblyData, metadataData, unityVersionString);
@@ -53,5 +55,6 @@ public virtual void LoadIl2CppAssemblyDefinitionsAsDll()
5355
}
5456
}
5557
}
58+
#endif
5659
}
5760
}

TypeTreeGeneratorAPI/TypeTreeGeneratorAPI.csproj

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
<EnableAssetRipper>true</EnableAssetRipper>
1818
<EnableAssetsTools>true</EnableAssetsTools>
1919
<EnableAssetStudio>true</EnableAssetStudio>
20+
21+
<EnableIL2CPP>true</EnableIL2CPP>
2022
</PropertyGroup>
2123

2224
<PropertyGroup Condition="'$(EnableAssetRipper)' == 'true'">
@@ -28,6 +30,9 @@
2830
<PropertyGroup Condition="'$(EnableAssetStudio)' == 'true'">
2931
<DefineConstants>$(DefineConstants);ENABLE_ASSET_STUDIO</DefineConstants>
3032
</PropertyGroup>
33+
<PropertyGroup Condition="'$(EnableIL2CPP)' == 'true'">
34+
<DefineConstants>$(DefineConstants);ENABLE_IL2CPP</DefineConstants>
35+
</PropertyGroup>
3136

3237
<ItemGroup Condition="'$(EnableAssetRipper)' == 'false'">
3338
<Compile Remove="TypeTreeGenerator/AssetRipper/**/*" />
@@ -41,23 +46,29 @@
4146

4247
<ItemGroup>
4348
<PackageReference Include="AssetRipper.Primitives" Version="3.2.0" />
44-
<PackageReference Include="Samboy063.Cpp2IL.Core" Version="2022.1.0-pre-release.19" />
4549
<PackageReference Include="System.Text.Json" Version="9.0.2" />
4650
</ItemGroup>
4751

52+
<ItemGroup Condition="'$(EnableIL2CPP)' == 'true'">
53+
<PackageReference Include="Samboy063.Cpp2IL.Core" Version="2022.1.0-pre-release.19" />
54+
</ItemGroup>
55+
4856
<ItemGroup Condition="'$(EnableAssetRipper)' == 'true'">
4957
<ProjectReference Include="..\AssetRipper\Source\AssetRipper.SerializationLogic\AssetRipper.SerializationLogic.csproj" />
5058
</ItemGroup>
5159

5260
<ItemGroup Condition="'$(EnableAssetsTools)' == 'true'">
53-
<PackageReference Include="AssetsTools.NET.Cpp2IL" Version="1.0.1-preview1" />
5461
<PackageReference Include="AssetsTools.NET.MonoCecil" Version="1.0.1" />
5562
</ItemGroup>
5663

5764
<ItemGroup Condition="'$(EnableAssetsTools)' or '$(EnableAssetStudio)' == 'true'">
5865
<PackageReference Include="Mono.Cecil" Version="0.11.6" />
5966
</ItemGroup>
6067

68+
<ItemGroup Condition="'$(EnableIL2CPP)' == 'true' and '$(EnableAssetsTools)' == 'true'">
69+
<PackageReference Include="AssetsTools.NET.Cpp2IL" Version="1.0.1-preview1" />
70+
</ItemGroup>
71+
6172
<ItemGroup Condition="'$(EnableAssetStudio)' == 'true'">
6273
<Compile Include="..\UnityCsReference\Tools\Unity.CecilTools\CecilUtils.cs">
6374
<Link>TypeTreeGenerator\AssetStudio\Unity.CecilTools\CecilUtils.cs</Link>

0 commit comments

Comments
 (0)