Frage

Was ist die Syntax für die Definition eines Arrayliteral in CIL für die Zwecke ein Mitglied mit einem benutzerdefinierten Attribute schmücken?

Ich bin einig .NET-Code in CIL Schreiben (mit ilasm.exe es zu kompilieren) und ich brauche eine Methode mit einem benutzerdefinierten Attribute zu schmücken. Der Konstruktor für dieses Attribut nimmt ein Array von ganzen Zahlen als einzigen Parameter. Wie kann ich dies in CIL tun?

Dies ist die Unterschrift der Konstrukteurs-benutzerdefinierten Attribute (ich kann es nicht ändern):

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

Dies ist, wie ich meine Methode schmücken würde, wenn ich wurde in C # zu schreiben (aber ich kann nicht):


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

Mit ildasm.exe bei der kompilierten C # suchen (zu versuchen und durch Reverse Engineering zu verstehen) gibt mir eine hässliche und unbrauchbar binäre wörtlich zu nehmen. Ich habe versucht, mit Reflector.NET statt und es sieht viel besser, aber ilasm.exe wirft einen Syntaxfehler bei dem Stichwort „neuen“ so ich es nicht verwenden können:

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }
War es hilfreich?

Lösung

schwer zu erraten, was das Problem sein könnte. Wenn ich dieses Attribut auf einen Program.Test () Methode anwenden, ich diese:

  .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

Führen Sie dies durch ilasm.exe, kein Problem. Hinweis, wie die Arrayelementwerte (Scrollen des Schnipsel Fenster rechts, sie zu sehen) sind bereits in die sie eingebettet werden in dem Attributdatentabelle Konstruktor benötigt Format konvertiert. BitConverter.GetBytes () kann getan Teil dieser Arbeit zu bekommen. Das Ecma Dokument sollte das gewünschte Format dieser Daten hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top