ich eine dynamische Methode, d.h .:C# Emit IL - Push-Wert eines Objekts auf Stapel?
class MyClass
{
private void object _o = <whatever>;
void CreateDynamicMethod()
{
DynamicMethod dm = new DynamicMethod("Test", ...);
// emit various IL
// need to push _o onto stack here
}
}
Der zweite Kommentar, ich möchte den Wert von _o derzeit auf den Stapel schieben. Ich möchte nicht die Referenz von _o drücken, da sie sich ändern wird, wenn ich die dynamische Methode erstelle.
Also sagen wir _o = 5, möchte ich die 5 drücken, wenn _o eine Liste enthält, möchte ich das schieben, wenn es eine Zeichenfolge enthält, möchte ich die Zeichenfolge drücken.
Die dynamische Methode (Test) ist eine statische Methode und es wird offensichtlich nicht den This-Zeiger von MyClass haben, um das Feld zu erhalten. Ich kann es nicht einmal in eine statische Variable einfügen, auf die während der Ausführung von Test() zugegriffen wird, und nicht während ich die Methode erstelle.
Auch wenn ich den This-Zeiger hatte, wird _o nicht den richtigen Wert bei Test() Ausführungszeit haben.
Irgendwelche Vorschläge?
Sie meinen eine GCHandle? In meinem Builder-Code habe ich: Objekt o = blah; GCHandle.Alloc (o). ToIntPtr(). ToInt64() mit einem Opcodes.Ldc_I8 und es stürzte nicht, aber als ich versuchte, den Wert im Debugger anzuzeigen, konnte es auf Speicherfehler nicht zugreifen. – SledgeHammer
@SledgeHammer - Nein, ich meine nicht ein GC-Handle. Ich meine, speichern Sie das Objekt und legen Sie es irgendwo weg, in einem Array, einer Datei, was auch immer. Haben Sie einfach eine nette statische Methode irgendwo, die einen int-Parameter übernimmt und das Objekt an Sie zurückgibt, und dann können Sie diese ganze Zahl auf den Stapel schieben, wobei Sie wissen, dass Ihre statische Methode es als Schlüssel zum späteren Abrufen des Objekts verwenden wird. Um es anders auszudrücken - das einzige Objekt, das Sie zum Kompilieren auf den Stapel schieben können, ist int oder ein Token für ein String-Literal (Sie können ein großes Objekt in einem davon halten!) – hoodaticus
Ja, ich hatte diese Idee früher eine statische Methode/Wörterbuch, aber es schien hacky. LOL. Dachte, es könnte einen besseren Weg geben. Raten Sie nicht :(. Danke. – SledgeHammer