es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener los atributos personalizados de un método?

Suponiendo que tenemos un método definido como se muestra a continuación:

public class SomeClass
{
    [My("beautifulName")]
    public void DoSomeThing()
    {
         // lo que sea.
    }
}

La clase public MyAttribute : Attribute tiene las siguientes propiedades:

public string Name { get; init; }
public MyAttribute(string name) => Name = name;

Ahora tenemos un volcado de memoria de esta aplicación, podemos usar ClrMD para encontrar fácilmente el tipo SomeClass y luego podemos encontrar fácilmente el método DoSomeThing de ClrMethod. Ahora, ¿cómo puedo encontrar la instancia correspondiente de MyAttribute y obtener el valor de beautifulName?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar la instancia correspondiente de MyAttribute y obtener el valor de beautifulName, puede seguir los siguientes pasos:

    1. Obtenga el objeto ClrType que representa el tipo SomeClass utilizando ClrMD.
      ClrType someClassType = runtime.GetTypeByName("SomeClass");
    2. Obtenga una lista de todos los objetos ClrMethod que representan todos los métodos en el tipo SomeClass.
      IEnumerable<clrmethod> methods = someClassType.Methods;
    3. Encuentre el objeto ClrMethod específico que representa el método DoSomeThing.
      ClrMethod doSomethingMethod = methods.First(m => m.Name == "DoSomeThing");
    4. Obtenga el valor de MetadataToken del doSomethingMethod.
      int doSomethingMethodToken = doSomethingMethod.MetadataToken;
    5. Obtenga el objeto MethodDesc que representa el doSomethingMethod utilizando Windbg/SOS.
      !dumpmd -md <dosomethingmethodtoken>
    6. Obtenga la dirección MethodTable que representa la instancia de SomeClass.
      !dumpobj <someclassinstanceaddress>
    7. Obtenga el objeto EEClass que representa la instancia de SomeClass.
      !DumpClass <someclassinstanceaddress>
    8. Obtenga el objeto MethodTable que representa la instancia de SomeClass.
      !DumpMT -md <someclassinstancemethodtabletoken>
    9. Obtenga el objeto MethodInfo que representa el método DoSomeThing.
      !DumpMD -md <someclassinstancemethodtabletoken> -tid <threadid> -private
    10. Obtenga la dirección MethodDesc que representa el método DoSomeThing.
      !clrstack -a <threadid> // Para encontrar la dirección del marco de la pila
      !u <dosomethingmethodaddress> // Para desensamblar y encontrar la dirección de MethodDesc
    11. Obtenga el objeto CustomAttributeData que representa la instancia de MyAttribute.
      CustomAttributeData myAttributeData = doSomethingMethod.GetCustomAttributesData().First(a => a.AttributeType == typeof(MyAttribute));
    12. Finalmente, obtenga el valor de la propiedad Name de la instancia de MyAttribute.
      string beautifulName = myAttributeData.ConstructorArguments[0].Value.ToString();

Comments are closed.