From f30e2f5b33ae2eb7c33d893514071136fed8dd59 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 12 Jan 2024 21:40:45 +0800 Subject: [PATCH] =?UTF-8?q?[new]=20=E6=96=B0=E5=A2=9E=20AOTAssemblyMetadat?= =?UTF-8?q?aStripper=E7=94=A8=E4=BA=8E=E5=89=94=E9=99=A4AOT=20dll=E4=B8=AD?= =?UTF-8?q?=E9=9D=9E=E6=B3=9B=E5=9E=8B=E5=87=BD=E6=95=B0=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/AOT/AOTAssemblyMetadataStripper.cs | 46 +++++++++++++++++++ .../AOT/AOTAssemblyMetadataStripper.cs.meta | 11 +++++ 2 files changed, 57 insertions(+) create mode 100644 Editor/AOT/AOTAssemblyMetadataStripper.cs create mode 100644 Editor/AOT/AOTAssemblyMetadataStripper.cs.meta 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: