From b2b5ef8e70ee91a2db7c3e4acf98e64e0730aad5 Mon Sep 17 00:00:00 2001 From: ztx <30760655@qq.com> Date: Sun, 20 Sep 2026 08:48:19 +0800 Subject: [PATCH] Skip rewriting CoreCLR netstandard facades that only forward System.Object. Co-authored-by: Cursor --- Confuser.Core/ConfuserAssemblyResolver.cs | 49 ++++++++++++++++------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/Confuser.Core/ConfuserAssemblyResolver.cs b/Confuser.Core/ConfuserAssemblyResolver.cs index 500d3f92e..ff9f64202 100644 --- a/Confuser.Core/ConfuserAssemblyResolver.cs +++ b/Confuser.Core/ConfuserAssemblyResolver.cs @@ -45,32 +45,40 @@ public AssemblyDef Resolve(IAssembly assembly, ModuleDef sourceModule) { } if (resolvedAssemblyDef?.Name == "netstandard" && 0 < resolvedAssemblyDef.ManifestModule.ExportedTypes.Count) { - // Move types from AssemblyRef to here + // Classic netstandard facades forward to mscorlib, which actually defines the types. + // Moving those types in keeps the confused module referencing netstandard only. + // CoreCLR publish output is different: netstandard.dll only forwards to System.Runtime, + // and that assembly forwards again to System.Private.CoreLib. Clearing the forwards + // there hides System.Object and breaks later analysis. var module = resolvedAssemblyDef.ManifestModule; - var newTypes = new List(); - var allAssemblyRefs = new List(); - - module.ExportedTypes.Clear(); - + var referenced = new List(); foreach (var assemblyRef in module.GetAssemblyRefs()) { var subAss = InternalExactResolver.Resolve(assemblyRef, module) ?? InternalFuzzyResolver.Resolve(assemblyRef, module); - allAssemblyRefs.Add(subAss); - foreach (var subModule in subAss?.Modules) { - foreach (var defType in subModule.Types) { + if (subAss != null) + referenced.Add(subAss); + } + + // Only rewrite when a referenced assembly actually defines System.Object + // (the mscorlib case). CoreCLR facades only forward it onward. + if (!referenced.Any(DefinesSystemObject)) + return resolvedAssemblyDef; + + var newTypes = new List(); + module.ExportedTypes.Clear(); + + foreach (var subAss in referenced) { + foreach (var subModule in subAss.Modules) { + foreach (var defType in subModule.Types) newTypes.Add(defType); - } subModule.Types.Clear(); - foreach (var defType in newTypes) { + foreach (var defType in newTypes) module.Types.Add(defType); - } newTypes.Clear(); } - } - // Remove them because their types has been removed. - foreach (var subAss in allAssemblyRefs) { + // Their types now live on netstandard, so they must not stay cached. InternalExactResolver.Remove(subAss); InternalFuzzyResolver.Remove(subAss); } @@ -79,6 +87,17 @@ public AssemblyDef Resolve(IAssembly assembly, ModuleDef sourceModule) { return resolvedAssemblyDef; } + static bool DefinesSystemObject(AssemblyDef assembly) { + foreach (var module in assembly.Modules) { + foreach (var type in module.Types) { + if (type.Namespace == "System" && type.Name == "Object") + return true; + } + } + + return false; + } + public void Clear() { InternalExactResolver.Clear(); InternalFuzzyResolver.Clear();