Ich versuche gerade, eine property Get-Implementierung zu tauschen, indem ich sie durch ein bisschen IL ersetze. Ich habe diese Frage als Referenz verwendet: Wie ersetze ich einen Zeiger auf einen Zeiger auf eine Methode in einer Klasse meiner Methode, die von der Systemklasse geerbt wurde?
Der einzige Unterschied, den ich habe, ist, dass meine Methode über einen MethodBuilder deklariert wird:
%Vor% Dies fügt eine neue Funktion zu einem generierten Typ namens BeforeGet{PropertyName}
Nachdem ich den neuen Typ erzeugt habe, instantiiere ich ihn, um sicherzustellen, dass die Speicheradresse existiert:
dynamic fakeType = Activator.CreateInstance(type);
Ich lade die propertyInfo GetMethod von der vorhandenen Klasse und der neu erstellten BeforeGet{PropertyName}
fakeType-Klasse Type ab.
Danach werden beide MethodInfo's in dieser Funktion verwendet:
%Vor% Nachdem ich diesen Code ausgeführt habe, führe ich den folgenden Code in meinem Programm aus:
LoadedTag.Item.ItemID;
Wobei LoadedTag die Klasse ist, die eine neue Implementierung von Item
Getter erhalten haben soll, aber stattdessen bekomme ich eine Null-Referenz-Ausnahme, weil die Funktion nicht ersetzt wurde.
Wenn ich diesen Code jedoch im unmittelbaren Fenster ausführe, wird die ItemID tatsächlich gesetzt und die Intercepting-Funktion aufgerufen.
Ich denke, das Problem liegt daran, dass der Garbage Collector den fakeType entfernt, der die tatsächlichen Zeiger auf die Funktionen enthält, die während des Methodenaustauschs verwendet werden. Wenn ja, wie soll ich das lösen?
Vielen Dank im Voraus!
Bei Bedarf erkundigen Sie sich bitte nach dem vollständigen Code und ich werde ihn auf Github hochladen.