Als ein bisschen eine Neuheit, ich versuche zu sehen, wie anders die IL von Lightweight-Code zur Laufzeit erstellt vs Code vom VS-Compiler erzeugt, als ich festgestellt habe, dass VS-Code neigt dazu, mit einem anderen Leistungsprofil zu laufen Dinge wie Guss.Wie erhalte ich ein IL-Bytearray von einer DynamicMethod?
Also schrieb ich den folgenden Code ::
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Leider ist dies löst eine Ausnahme als GetMethodBody offenbar eine illegale Operation Code durch Expression Bäume erzeugt wird. Wie kann ich in einer Bibliotheksart (d. H. Nicht mit einem externen Tool, es sei denn, das Tool verfügt über eine API) den Code anzeigen, der mit Hilfe von Lightweight Codegen generiert wurde?
Bearbeiten: Der Fehler tritt in Zeile 5, kompilierte.Method.GetMethodBody() löst die Ausnahme.
Edit2: Kann jemand die lokalen Variablen, die in der Methode deklariert werden, wiederherstellen? Oder gibt es keine Möglichkeit, GetVariables?
Welche Zeile wirft die Ausnahme? Kannst du das erste Array.ForEach auskommentieren und sehen, ob das funktioniert?Ich vermute, dass der erste Aufruf von GetMethodBody() fehlschlägt, weil dieser Ausdruck nicht nach IL kompiliert wurde. Ich sehe keinen Grund, warum der zweite Anruf fehlschlagen sollte. – cdhowie
Interessante Frage. Beim GetMethodBody-Aufruf erhalte ich eine InvalidOperationException ("Operation ist wegen des aktuellen Status des Objekts nicht gültig"). Ich bin mir nicht sicher, wie das Leben als CachedAnonymousDelegate vs Expression Ihr Verhalten als Func beeinflussen würde. Ich werde weiter daran arbeiten. – Sorax
Die ausgewählte Antwort sollte umgeschaltet werden, da sie nicht alle Fälle abdeckt und unnötig komplex ist. Bitte lesen Sie [diese Antwort] (http://stackoverflow.com/a/35711507/521757). – jnm2