Question

Quelle est la syntaxe pour définir un littéral de tableau dans CIL pour l'application de la décoration d'un membre d'un attribut personnalisé?

Je suis en train d'écrire un code .NET dans CIL (en utilisant Ilasm.exe pour compiler) et je dois décorer une méthode avec un attribut personnalisé. Le constructeur de cet attribut prend un tableau d'entiers comme seul paramètre. Comment puis-je faire en CIL?

Ceci est la signature du constructeur de l'attribut personnalisé (je ne peux pas le changer):

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

Voici comment je décorer ma méthode si je devais écrire en C # (mais je ne peux pas):


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

Utilisation ildasm.exe pour regarder le C # compilé (pour essayer de comprendre par l'ingénierie inverse) me donne un littéral binaire laid et inutilisable. J'ai essayé d'utiliser à la place Reflector.NET et il semble beaucoup mieux, mais Ilasm.exe génère une erreur de syntaxe au mot-clé « nouvelle » donc je ne peux pas l'utiliser:

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

La solution

Difficile de deviner ce que votre problème est peut-être. Si j'applique cet attribut à une méthode Program.Test (), je reçois ceci:

  .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

Exécuter ce par Ilasm.exe, aucun problème. Notez comment les valeurs des éléments du tableau (faire défiler la fenêtre d'extrait vers la droite pour les voir) sont déjà convertis dans le format nécessaire pour les intégrer dans le tableau de données constructeur d'attribut. BitConverter.GetBytes () peut obtenir une partie de ce travail. Le document Ecma devrait avoir le format requis de ces données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top