diff --git a/Editor/AOT/AOTAssemblyMetadataStripper.cs b/Editor/AOT/AOTAssemblyMetadataStripper.cs new file mode 100644 index 0000000..87a76a1 --- /dev/null +++ b/Editor/AOT/AOTAssemblyMetadataStripper.cs @@ -0,0 +1,46 @@ +using dnlib.DotNet; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HybridCLR.Editor.AOT +{ + public class AOTAssemblyMetadataStripper + { + public static byte[] Strip(byte[] assemblyBytes) + { + var mod = ModuleDefMD.Load(assemblyBytes); + foreach (var type in mod.GetTypes()) + { + if (type.HasGenericParameters) + { + continue; + } + foreach (var method in type.Methods) + { + if (!method.HasBody || method.HasGenericParameters) + { + continue; + } + method.Body = null; + } + } + var writer = new System.IO.MemoryStream(); + mod.Write(writer); + writer.Flush(); + return writer.ToArray(); + } + + public static void Strip(string originalAssemblyPath, string strippedAssemblyPath) + { + byte[] originDllBytes = System.IO.File.ReadAllBytes(originalAssemblyPath); + byte[] strippedDllBytes = Strip(originDllBytes); + UnityEngine.Debug.Log($"aot dll:{originalAssemblyPath}, length: {originDllBytes.Length} -> {strippedDllBytes.Length}, stripping rate:{(originDllBytes.Length - strippedDllBytes.Length)/(double)originDllBytes.Length} "); + Directory.CreateDirectory(System.IO.Path.GetDirectoryName(strippedAssemblyPath)); + System.IO.File.WriteAllBytes(strippedAssemblyPath, strippedDllBytes); + } + } +} diff --git a/Editor/AOT/AOTAssemblyMetadataStripper.cs.meta b/Editor/AOT/AOTAssemblyMetadataStripper.cs.meta new file mode 100644 index 0000000..f7642f9 --- /dev/null +++ b/Editor/AOT/AOTAssemblyMetadataStripper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7e9e6a048682dcb4fab806251411f29f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: