修复symbol mapping文件时输出内容顺序不稳定的问题

1.x
walon 2025-06-06 22:25:45 +08:00
parent 58ad0fca67
commit 8bd2aab9da
1 changed files with 20 additions and 24 deletions

View File

@ -374,37 +374,33 @@ namespace Obfuz.ObfusPasses.SymbolObfus
var root = doc.CreateElement("mapping"); var root = doc.CreateElement("mapping");
doc.AppendChild(root); doc.AppendChild(root);
var sortedModRenames = _modRenames.ToList(); var totalAssNames = _modRenames.Keys.Select(m => m.Assembly.Name.ToString()).Concat(_assemblies.Keys).ToHashSet().ToList();
sortedModRenames.Sort((a, b) => a.Value.oldName.CompareTo(b.Value.oldName)); totalAssNames.Sort((a, b) => a.CompareTo(b));
foreach (var kvp in sortedModRenames) foreach (string assName in totalAssNames)
{ {
ModuleDef mod = kvp.Key; ModuleDef mod = _modRenames.Keys.FirstOrDefault(m => m.Assembly.Name == assName);
RenameRecord record = kvp.Value;
var assemblyNode = doc.CreateElement("assembly"); var assemblyNode = doc.CreateElement("assembly");
assemblyNode.SetAttribute("name", mod.Assembly.Name); assemblyNode.SetAttribute("name", assName);
foreach (TypeDef type in mod.GetTypes()) root.AppendChild(assemblyNode);
if (mod != null)
{
var types = mod.GetTypes().ToDictionary(t => _typeRenames.TryGetValue(t, out var rec) ? rec.oldName : t.FullName, t => t);
var sortedTypes = new SortedDictionary<string, TypeDef>(types);
foreach (TypeDef type in sortedTypes.Values)
{ {
WriteTypeMapping(assemblyNode, type); WriteTypeMapping(assemblyNode, type);
} }
root.AppendChild(assemblyNode);
} }
else
var sortedAsses = GetSortedValueList(_assemblies, (a, b) => a.assName.CompareTo(b.assName));
foreach (RenameMappingAssembly ass in sortedAsses)
{ {
if (_modRenames.Keys.Any(m => m.Assembly.Name == ass.assName)) RenameMappingAssembly ass = _assemblies[assName];
{
continue;
}
var assemblyNode = doc.CreateElement("assembly");
assemblyNode.SetAttribute("name", ass.assName);
var sortedTypes = GetSortedValueList(ass.types, (a, b) => a.oldFullName.CompareTo(b.oldFullName)); var sortedTypes = GetSortedValueList(ass.types, (a, b) => a.oldFullName.CompareTo(b.oldFullName));
foreach (var type in sortedTypes) foreach (var type in sortedTypes)
{ {
WriteTypeMapping(assemblyNode, type.oldFullName, type); WriteTypeMapping(assemblyNode, type.oldFullName, type);
} }
root.AppendChild(assemblyNode); }
} }
Directory.CreateDirectory(Path.GetDirectoryName(_mappingFile)); Directory.CreateDirectory(Path.GetDirectoryName(_mappingFile));
doc.Save(_mappingFile); doc.Save(_mappingFile);