Kann eine interne Methode von einer dynamischen Methode in .NET aufgerufen werden?

8

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:

  • geben Sie sicher getter1 mit Delegate.CreateDelegate
  • ein
  • geben unsafe getter2 mit DynamicMethod
  • ein

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?

    
mark 22.11.2009, 05:34
quelle

1 Antwort

6

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.

    
Sam Saffron 22.11.2009, 11:15
quelle