Pregunta

¿Cuál es la sintaxis para definir un literal de matriz en CIL para los fines de la decoración de un miembro con un atributo personalizado?

Estoy escribiendo algo de código .NET en CIL (usando ilasm.exe compilarlo) y necesito para decorar un método con un atributo personalizado. El constructor para ese atributo toma una matriz de números enteros como su único parámetro. ¿Cómo puedo hacer esto en CIL?

Esta es la firma del constructor del atributo personalizado (no puedo cambiarlo):

public FooAttribute(int[] values) {
// some hidden constructor stuff
}

Esta es la forma en que me decorar mi método si estuviera escribiendo en C # (pero no puedo):


[Foo(new int[] {1, 2, 3, 4})]
public string Bar() {
  return "Some text";
}

El uso de ildasm.exe mirar el compilado C # (para tratar de entender por ingeniería inversa) me da una literal binario fea e inutilizable. He intentado utilizar Reflector.NET lugar y se ve mucho mejor, pero ilasm.exe arroja un error de sintaxis en la palabra clave "nueva" así que no puedo utilizarlo:

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }
¿Fue útil?

Solución

Es difícil de adivinar lo que podría ser su problema. Si aplico este atributo a un método Program.Test (), me sale esto:

  .method private hidebysig static void  Test() cil managed
  {
    .custom instance void ConsoleApplication1.FooAttribute::.ctor(int32[]) = ( 01 00 04 00 00 00 01 00 00 00 02 00 00 00 03 00 
                                                                               00 00 04 00 00 00 00 00 ) 
    // Code size       2 (0x2)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  } // end of method Program::Test

Ejecutar este a través ilasm.exe, no hay problema. Nota cómo los valores de elementos de array (desplazarse por la ventana fragmento hacia la derecha para verlas) ya se convierten en el formato necesario para incrustarlos en la tabla de datos de atributos constructor. BitConverter.GetBytes () se puede obtener parte de ese trabajo. El documento ECMA debe tener el formato requerido de esos datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top