Wie IL zur Laufzeit in eine Methode injiziert wird

8

Titel sagt mehr oder weniger alles. Basierend auf diesem Artikel, habe ich folgendes herausgefunden:

%Vor%

Das funktioniert tatsächlich ... gelegentlich -.-

Zum Beispiel funktioniert das.

%Vor%

Dies ist jedoch nicht (SEHException). Ich habe nur die Reihenfolge geändert, in der die Funktionen definiert wurden.

%Vor%

Wie für den Code in dem Artikel ... Ich konnte es überhaupt nicht funktionieren.

Irgendwelche Ideen / Alternativen?

    
YellPika 29.01.2011, 22:07
quelle

1 Antwort

8

Dies ist eine Menge schlechte Annahmen, die Sie in den Arsch beißen werden.

Zunächst einmal ist die Struktur, die über Reflektion zurückgegeben wird, in keiner Weise garantiert, auf irgendwelche Runtime-Strukturen zu verweisen. Daher ist es einfach falsch, zu versuchen, die enthaltenen Zeiger zu ändern oder zurückzugeben.

Zweitens, wenn Sie etwas wie das Injizieren von Pre- / Post-Methoden-Aufruf-Invarianten (als ein Beispiel) machen möchten, dann sollten Sie wahrscheinlich Laufzeit-Proxy-Objekte konstruieren und stattdessen diese injizieren. Oder verwenden Sie die dynamische Methodenkonstruktion über den Emit-Namespace. Der Versuch, Dinge durch undokumentiertes / unbekanntes Verhalten (wie den obigen Code) zu manipulieren, funktioniert einfach nicht.

Sie müssen auch erkennen, dass das JIT entscheidet, wann es ausgeführt wird. Manchmal läuft es gegen eine ganze Klasse und manchmal läuft es nur gegen eine einzige Methode. Ihr Code versucht nicht zu bestimmen, ob die Methode bereits JITted wurde, und geht blind davon aus, dass der zurückgegebene Funktionszeiger geändert werden kann.

    
Washu 29.01.2011, 22:20
quelle

Tags und Links