Ich versuche, eine interne Methode von einer dynamisch erzeugten aufzurufen. Der il-Code ist einfach: ldarg_0, callvirt, ret.
Die Ausführung der Methode schlägt mit TypeLoadException fehl und besagt, dass sie den Typ, für den die interne Methode definiert ist, nicht laden kann.
Wenn ich darüber nachdenke, scheint das logisch zu sein, weil die Host-Assembly der dynamischen Methode kein Freund der deklarierenden Assembly der Methode ist.
Ich habe jedoch erwartet, dass die dynamische Methode immer noch funktioniert, genau wie Delegate.CreateDelegate funktioniert. Immerhin habe ich es geschafft, die MethodInfo der internen Methode zu bekommen, so dass die Berechtigungsbarriere hinter mir liegt.
Wie auch immer, die Frage ist: "Ist es möglich, eine interne Methode von einer dynamisch erzeugten aufzurufen?"
Danke.
BEARBEITEN:
Hier ist ein einfaches Codebeispiel, das das Problem demonstriert:
%Vor%Im Code erstelle ich zwei offene Instanz-Delegaten, um auf die Data.String-Instanzeigenschaft zuzugreifen:
Der typsichere Delegat, der von Delegate.CreateDelegate erstellt wird, funktioniert, während derjenige, der DynamicMethod verwendet, mit der TypeLoadException fehlschlägt.
Beachten Sie, dass ich den typsicheren Ansatz nicht verwenden möchte, da der Kontext, in dem der Getter erstellt wird, nicht generisch ist. Natürlich kann ich dieses Problem lösen, aber die Frage ist jetzt die des Prinzipals - warum DynamicMethod fehlschlägt, wo Delegate.CreateDelegate gelingt?
Es funktioniert, wenn Sie Sichtbarkeitsprüfungen überspringen.
Ändern Sie diese Zeile
%Vor%Siehe msdn : (insbesondere die Tabelle mit allen Regeln.)
Dies ist von der Doco im Konstruktor.
restrictedSkipVisibilitätstyp: System.Boolean true, um JIT zu überspringen Sichtbarkeitsprüfungen für Typen und Mitglieder Zugriff durch die MSIL der dynamischen Methode, mit dieser Einschränkung: die Vertrauensgrad der Baugruppen, die enthalten diese Typen und Mitglieder müssen gleich oder weniger als das Vertrauen sein Level des Callstacks, der den dynamische Methode; sonst, falsch.
Tags und Links .net reflection.emit dynamic-method