修复rename Custom中枚举类型的bug

backup
walon 2025-04-13 10:31:55 +08:00
parent b3ccb26003
commit 8b082a0905
3 changed files with 63 additions and 6 deletions

View File

@ -24,7 +24,7 @@ namespace Obfuz
_assemblyPathResolver = assemblyResolver;
_modCtx = ModuleDef.CreateModuleContext();
_asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
_asmResolver.EnableTypeDefCache = true;
_asmResolver.EnableTypeDefCache = false;
_asmResolver.UseGAC = false;
}
@ -67,7 +67,7 @@ namespace Obfuz
{
//Debug.Log($"do load module:{dllPath}");
ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx);
//mod.EnableTypeDefFindCache = true;
mod.EnableTypeDefFindCache = false;
_asmResolver.AddToCache(mod);
return mod;
}

View File

@ -1,7 +1,9 @@
{
"name": "Obfuz.Editor",
"rootNamespace": "",
"references": [],
"references": [
"GUID:167b4b7f91c16bb4183f7298af665076"
],
"includePlatforms": [
"Editor"
],

View File

@ -380,6 +380,7 @@ namespace Obfuz
{
return null;
}
string typeName = oldValue.GetType().FullName;
if (oldValue.GetType().IsPrimitive)
{
return oldValue;
@ -436,6 +437,23 @@ namespace Obfuz
return false;
}
private bool TryRenameArgument(ModuleDefMD mod, string oldFullName, CANamedArgument oldArg)
{
bool anyChange = false;
TypeSig newType = RenameTypeSig(oldArg.Type, mod, oldFullName);
if (newType != oldArg.Type)
{
anyChange = true;
oldArg.Type = newType;
}
if (TryRenameArgument(mod, oldFullName, oldArg.Argument, out var newArg))
{
oldArg.Argument = newArg;
anyChange = true;
}
return anyChange;
}
private void RenameTypeRefInCustomAttribute(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef typeDef, string oldFullName)
{
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
@ -460,10 +478,36 @@ namespace Obfuz
for (int i = 0; i < cai.namedArguments.Count; i++)
{
CANamedArgument oldArg = cai.namedArguments[i];
if (TryRenameArgument(mod, oldFullName, oldArg.Argument, out var newArg))
if (TryRenameArgument(mod, oldFullName, oldArg))
{
anyChange = true;
oldArg.Argument = newArg;
}
}
}
if (anyChange)
{
cai.customAttributes[cai.index] = new CustomAttribute(oldAttr.Constructor,
cai.arguments != null ? cai.arguments : oldAttr.ConstructorArguments,
cai.namedArguments != null ? cai.namedArguments : oldAttr.NamedArguments);
}
}
}
private void RenameFieldNameInCustomAttributes(ModuleDefMD referenceMeMod, ModuleDefMD mod, string oldFieldOrPropertyName, string newName)
{
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
foreach (CustomAttributeInfo cai in customAttributes)
{
CustomAttribute oldAttr = cai.customAttributes[cai.index];
bool anyChange = false;
if (cai.namedArguments != null)
{
foreach (CANamedArgument arg in cai.namedArguments)
{
if (arg.Name == oldFieldOrPropertyName)
{
anyChange = true;
arg.Name = newName;
}
}
}
@ -528,8 +572,12 @@ namespace Obfuz
Debug.Log($"rename assembly:{ass.name} field:{oldFieldFullName} => {memberRef}");
}
RenameFieldNameInCustomAttributes(ass.module, (ModuleDefMD)field.DeclaringType.Module, field.Name, newName);
}
field.Name = newName;
Debug.Log($"rename field. {field} => {newName}");
}
@ -549,7 +597,14 @@ namespace Obfuz
private void Rename(PropertyDef property)
{
property.Name = _nameMaker.GetNewName(property, property.Name);
string oldName = property.Name;
string newName = _nameMaker.GetNewName(property, oldName);
property.Name = newName;
ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module;
foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod))
{
RenameFieldNameInCustomAttributes(ass.module, mod, oldName, newName);
}
}
}
}