obfuz/Editor/TypeSigUtil.cs

195 lines
7.2 KiB
C#
Raw Normal View History

2025-04-16 13:12:21 +08:00
using dnlib.DotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Obfuz
{
public static class TypeSigUtil
{
public static string ComputeTypeDefSignature(TypeDef type)
{
return type.FullName;
}
public static string ComputeMethodDefSignature(MethodDef method)
{
var result = new StringBuilder();
ComputeTypeSigName(method.MethodSig.RetType, result);
result.Append(" ");
result.Append(method.DeclaringType.FullName);
result.Append("::");
result.Append(method.Name);
result.Append("(");
for (int i = 0; i < method.Parameters.Count; i++)
{
if (i > 0)
{
result.Append(", ");
}
ComputeTypeSigName(method.Parameters[i].Type, result);
}
result.Append(")");
return result.ToString();
}
public static string ComputeFieldDefSignature(FieldDef field)
{
var result = new StringBuilder();
ComputeTypeSigName(field.FieldSig.Type, result);
result.Append(" ");
result.Append(field.Name);
return result.ToString();
}
public static string ComputePropertyDefSignature(PropertyDef property)
{
var result = new StringBuilder();
ComputeTypeSigName(property.PropertySig.RetType, result);
result.Append(" ");
result.Append(property.Name);
return result.ToString();
}
public static string ComputeEventDefSignature(EventDef eventDef)
{
var result = new StringBuilder();
ComputeTypeSigName(eventDef.EventType.ToTypeSig(), result);
result.Append(" ");
result.Append(eventDef.Name);
return result.ToString();
}
public static string ComputeMethodSpecSignature(TypeSig type)
{
var sb = new StringBuilder();
ComputeTypeSigName(type, sb);
return sb.ToString();
}
public static void ComputeTypeSigName(TypeSig type, StringBuilder result)
{
type = type.RemovePinnedAndModifiers();
switch (type.ElementType)
{
case ElementType.Void: result.Append("void"); break;
case ElementType.Boolean: result.Append("bool"); break;
case ElementType.Char: result.Append("char"); break;
case ElementType.I1: result.Append("sbyte"); break;
case ElementType.U1: result.Append("byte"); break;
case ElementType.I2: result.Append("short"); break;
case ElementType.U2: result.Append("ushort"); break;
case ElementType.I4: result.Append("int"); break;
case ElementType.U4: result.Append("uint"); break;
case ElementType.I8: result.Append("long"); break;
case ElementType.U8: result.Append("ulong"); break;
case ElementType.R4: result.Append("float"); break;
case ElementType.R8: result.Append("double"); break;
case ElementType.String: result.Append("string"); break;
case ElementType.Ptr:
ComputeTypeSigName(((PtrSig)type).Next, result);
result.Append("*");
break;
case ElementType.ByRef:
ComputeTypeSigName(((ByRefSig)type).Next, result);
result.Append("&");
break;
case ElementType.ValueType:
case ElementType.Class:
{
var valueOrClassType = type.ToClassOrValueTypeSig();
var typeDef = valueOrClassType.ToTypeDefOrRef().ResolveTypeDefThrow();
2025-04-16 13:34:53 +08:00
if (typeDef.Module.IsCoreLibraryModule != true)
{
result.Append($"[{typeDef.Module.Assembly.Name}]");
}
2025-04-16 13:12:21 +08:00
result.Append(typeDef.FullName);
break;
}
case ElementType.GenericInst:
{
var genInst = (GenericInstSig)type;
ComputeTypeSigName(genInst.GenericType, result);
result.Append("<");
for (int i = 0; i < genInst.GenericArguments.Count; i++)
{
if (i > 0)
{
result.Append(",");
}
ComputeTypeSigName(genInst.GenericArguments[i], result);
}
result.Append(">");
break;
}
case ElementType.SZArray:
ComputeTypeSigName(((SZArraySig)type).Next, result);
result.Append("[]");
break;
case ElementType.Array:
{
var arraySig = (ArraySig)type;
ComputeTypeSigName(arraySig.Next, result);
result.Append("[");
for (int i = 0; i < arraySig.Rank; i++)
{
if (i > 0)
{
result.Append(",");
}
//result.Append(arraySig.Sizes[i]);
}
result.Append("]");
break;
}
case ElementType.FnPtr:
{
var fnPtr = (FnPtrSig)type;
result.Append("(");
MethodSig ms = fnPtr.MethodSig;
ComputeTypeSigName(ms.RetType, result);
result.Append("(");
for (int i = 0; i < ms.Params.Count; i++)
{
if (i > 0)
{
result.Append(",");
}
ComputeTypeSigName(ms.Params[i], result);
}
result.Append(")*");
break;
}
case ElementType.TypedByRef:
result.Append("typedref");
break;
case ElementType.I:
result.Append("nint");
break;
case ElementType.U:
result.Append("nuint");
break;
case ElementType.Object:
result.Append("object");
break;
case ElementType.Var:
{
var var = (GenericVar)type;
result.Append($"!{var.Number}");
break;
}
case ElementType.MVar:
{
var mvar = (GenericMVar)type;
result.Append($"!!{mvar.Number}");
break;
}
default: throw new NotSupportedException($"[ComputeTypeSigName] not support :{type}");
}
}
}
}