Domanda

Qual è la sintassi per la definizione di un letterale array in CIL ai fini di decorare un membro con un attributo personalizzato?

Sto scrivendo un certo codice .NET in CIL (utilizzando Ilasm.exe compilarlo) e ho bisogno di decorare un metodo con un attributo personalizzato. Il costruttore di quell'attributo prende un array di interi come unico parametro. Come posso fare questo in CIL?

Questa è la firma del costruttore di attributo personalizzato (non posso cambiarlo):

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

Questo è come mi piacerebbe decorare il mio metodo, se dovessi scrivere in C # (ma non ci riesco):


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

Utilizzando Ildasm.exe a guardare il compilato C # (per cercare di capire da reverse engineering) mi dà un letterale binario brutto e inutilizzabile. Ho provato ad utilizzare Reflector.NET invece e sembra molto meglio, ma ilasm.exe genera un errore di sintassi al la parola "nuovo", quindi non posso usarlo:

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }
È stato utile?

Soluzione

Difficile indovinare che cosa il vostro problema potrebbe essere. Se applico questo attributo a un metodo Program.Test (), ottengo questo:

  .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

Esegui questo attraverso Ilasm.exe, nessun problema. Si noti come i valori degli elementi di matrice (scorrere la finestra frammento a destra per visualizzarle) sono già convertiti nel formato necessario nell'incorporarli nella tabella dati attributi costruttore. BitConverter.GetBytes () può ottenere una parte di quel lavoro fatto. Il documento Ecma dovrebbe avere il formato richiesto di tali dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top