Das .NET Framework 4.0 führt verschiedene Elemente in die Reflection-API ein, die für meine Arbeit äußerst nützlich sind. Unter diesen sind geschützte Konstruktoren für Assembly
, Module
, MethodBody
und LocalVariableInfo
und die neue CustomAttributeData
Klasse. Es gibt ein paar Dinge, die ich noch brauche, die ziemlich mühsam sind, um zu arbeiten. Ich glaube, sie können leicht auf die gleiche [kleine] Gruppe von Menschen angewendet werden, müssten die Typen, die ich gerade aufgelistet habe, erweitern.Können wir eine Instanz von `OpCode` konstruieren?
Diesmal: Ich bin für einen Weg suchen, um eine Instanz der System.Reflection.Emit.OpCode
Struktur mit eigenen Parametern zu konstruieren. Ich rufe derzeit den internen Konstruktor auf, um die Instanzen zu erstellen. Es ist nicht schädlich für die Leistung, weil ich die konstruierten Elemente als public static readonly
Mitglieder einer Klasse für die Wiederverwendung verfügbar machen, aber wie Sie sich vorstellen können, ist dies ein extrem suboptimales Szenario.
Gibt es einen Grund, warum es nicht möglich ist, den aktuellen internen OpCode
Konstruktor public mit der Dokumentation zu machen, die OpCode
s benutzer konstruiert heißt es kann nicht mit ILGenerator
verwendet werden.
Edit: Hier ist ein Beispiel. Indem ich den folgenden benutzerdefinierten Opcode erstelle, kann ich ihn in Byte-Code-Transformationen zwischen einigen Zwischenanweisungen verwenden, ohne auf temporäre lokale Variablen zurückgreifen zu müssen. Wenn ich IL austrage, würde ich die verbleibenden swap
Anweisungen in eine gültige IL-Darstellung konvertieren, aber in meinem Fall ist der nächste Schritt ein JIT, der die benutzerdefinierte swap
-Anweisung versteht. Ich verwende das Prefix2
Präfix 0xFD
, das reserviert und von keinem gültigen IL-Opcodes verwendet wird.
/// <summary>
/// Swaps adjacent elements on the evaluation stack. The supplied inline int32 argument gives the
/// index of the topmost item in the pair.
/// </summary>
public static readonly OpCode Swap;
Ich werde dies auch für JIT-Spezifika verwenden, die eine einfache plattformabhängige Darstellung in den verschiedenen nativen Code-Generatoren keine einfache/common Managed-Code-Darstellung, sondern haben. Eine davon ist ldthread
(lädt einen Verweis auf die RuntimeThread
Darstellung des aktuellen verwalteten Threads).
Meinst du http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcode.aspx, die seit 1.0 vorhanden ist? –
Ja, das ist der eine. –