public static void MethodSignatureMangledName(this MethodReference method, StringBuilder builder) { builder.Append("("); if (method.HasParameters) { var parameters = method.Parameters; for (int i = 0; i < parameters.Count; i++) { ParameterDefinition parameter = parameters[i]; if (i > 0) { builder.Append(","); } if (parameter.ParameterType.IsSentinel) { builder.Append("...,"); } // We are replacing GenericInstance of type !0 with their real definitions (T, U, etc...) var parameterType = ResolveGenericsVisitor.Process(method, parameter.ParameterType, true); builder.Append(parameterType.MangledName()); } } builder.Append(")"); }
static bool MethodMatch(MethodReference candidate, MethodReference method) { var candidateResolved = candidate.Resolve(); // Check overrides if (candidateResolved.HasOverrides) { foreach (var @override in candidateResolved.Overrides) { var resolvedOverride = ResolveGenericsVisitor.Process(candidate, @override); if (resolvedOverride.FullName == method.FullName) { return(true); } } } if (!candidateResolved.IsVirtual) { return(false); } if (candidate.Name != method.Name) { return(false); } if (!TypeMatch(ResolveGenericsVisitor.Process(candidate, candidate.ReturnType), ResolveGenericsVisitor.Process(method, method.ReturnType))) { return(false); } if (candidate.Parameters.Count != method.Parameters.Count) { return(false); } for (int i = 0; i < candidate.Parameters.Count; i++) { if (!TypeMatch(ResolveGenericsVisitor.Process(candidate, candidate.Parameters[i].ParameterType), ResolveGenericsVisitor.Process(method, method.Parameters[i].ParameterType))) { return(false); } } return(true); }
public static string MangledName(this MethodReference method) { var builder = new StringBuilder(); if (method.DeclaringType != null) { builder.Append(method.DeclaringType.MangledName()).Append("::"); } builder.Append(method.Name); // Append generic arguments var genericInstanceMethod = method as GenericInstanceMethod; if (genericInstanceMethod != null) { foreach (var genericArgument in genericInstanceMethod.GenericArguments) { builder.Append('_'); builder.Append(genericArgument.MangledName()); } } if (method.Name == "op_Implicit" || method.Name == "op_Explicit") { // If it's op_Implicit or op_Explicit, we might want to use return type instead of first parameter (depending on which way the conversion is) builder.Append("_"); if (MemberEqualityComparer.Default.Equals(method.Parameters[0].ParameterType, method.DeclaringType)) { builder.Append("ret_"); builder.Append(method.ReturnType.MangledName()); } else { builder.Append(ResolveGenericsVisitor.Process(method, method.Parameters[0].ParameterType).MangledName()); } } else { // Method signature MethodSignatureMangledName(method, builder); } return(builder.ToString()); }