修复 RetargetTypeRefInCustomAttributes时匹配field或property没有比较TypeSig的bug

backup
walon 2025-04-15 17:49:02 +08:00
parent 688056e919
commit 1d1b257640
3 changed files with 64 additions and 3 deletions

View File

@ -34,7 +34,7 @@ namespace Obfuz
_options = options; _options = options;
_assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.AssemblySearchDirs.ToArray())); _assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.AssemblySearchDirs.ToArray()));
_renamePolicy = new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), new XmlConfigRenamePolicy()); _renamePolicy = new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), new XmlConfigRenamePolicy());
_nameMaker = new NameMaker(); _nameMaker = new TestNameMaker();
} }
public void DoIt() public void DoIt()

View File

@ -315,7 +315,8 @@ namespace Obfuz
} }
foreach (FieldDef field in hierarchyFields) foreach (FieldDef field in hierarchyFields)
{ {
if (field.Name == arg.Name) // FIXME. field of Generic Base Type may not be same
if (field.Name == arg.Name && TypeEqualityComparer.Instance.Equals(field.FieldType, arg.Type))
{ {
if (!refFieldMetasMap.TryGetValue(field, out var fieldMetas)) if (!refFieldMetasMap.TryGetValue(field, out var fieldMetas))
{ {
@ -502,7 +503,8 @@ namespace Obfuz
} }
foreach (PropertyDef field in hierarchyProperties) foreach (PropertyDef field in hierarchyProperties)
{ {
if (field.Name == arg.Name) // FIXME. field of Generic Base Type may not be same
if (field.Name == arg.Name && TypeEqualityComparer.Instance.Equals(arg.Type, field.PropertySig.RetType))
{ {
if (!refPropertyMetasMap.TryGetValue(field, out var fieldMetas)) if (!refPropertyMetasMap.TryGetValue(field, out var fieldMetas))
{ {

View File

@ -0,0 +1,59 @@
using dnlib.DotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Obfuz.Rename
{
public class TestNameMaker : INameMaker
{
private int _nextIndex;
private string GetDefaultNewName(string originName)
{
return $"{originName}>{_nextIndex++}";
}
public string GetNewName(ModuleDefMD mod, string originalName)
{
return GetDefaultNewName(originalName);
}
public string GetNewNamespace(TypeDef typeDef, string originalNamespace)
{
return GetDefaultNewName(originalNamespace);
}
public string GetNewName(TypeDef typeDef, string originalName)
{
return GetDefaultNewName(originalName);
}
public string GetNewName(MethodDef methodDef, string originalName)
{
return GetDefaultNewName(originalName);
}
public string GetNewName(ParamDef param, string originalName)
{
return GetDefaultNewName(originalName);
}
public string GetNewName(FieldDef fieldDef, string originalName)
{
return GetDefaultNewName(originalName);
}
public string GetNewName(PropertyDef propertyDef, string originalName)
{
return GetDefaultNewName(originalName);
}
public string GetNewName(EventDef eventDef, string originalName)
{
return GetDefaultNewName(originalName);
}
}
}