2016-04-26 22 views
4

Ich versuche, die folgende MSIL Methode aufzurufen:C# mit MSIL kombiniert - JIT Überspringen Verification

.method public hidebysig static bool IsRuntimeType(class [mscorlib]System.Type 'type') cil managed { 
    .maxstack 2 
    ldarg.0 
    isinst [mscorlib]System.RuntimeType 
    ldnull 
    cgt.un 
    ret 
} // end of method Program::IsRuntimeType 

Allerdings tritt diese Ausnahme beim Versuch, die Zeile auszuführen:

isinst [mscorlib]System.RuntimeType 

'TypeAccessException' that is occured when calling the method

Ja, ich bin mir der JIT-Verifizierung bewusst, aber ich habe viele Dinge ausprobiert und sie haben nicht funktioniert oder ich habe sie einfach falsch gemacht, ich bin mir nicht sicher. Außerdem konnte ich nicht viel darüber finden Gegenstand .

Ich habe die folgenden (in Kombination von einigen von ihnen zusammen) versucht:

  • hinzufügen [SecurityPermissionAttribute(SecurityAction.Demand, SkipVerification = true)] Attribut auf das Verfahren (auch mit SecurityAction.Assert)
  • Aufruf new ReflectionPermission(ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.RestrictedMemberAccess).Demand(); (und auch .Assert())
  • new SecurityPermission(SecurityPermissionFlag.AllFlags).Demand(); (und auch .Assert())

Nr ne dieser Forderungen und Behauptungen warf eine Ausnahme auf.

Um dies zu verdeutlichen, ist dies nur ein Beispiel. Die Hauptidee besteht darin, den Code funktionsfähig zu machen und die JIT-Verifizierung zu umgehen. Diese bestimmte Methode kann in C# nicht ohne Reflektion ausgeführt werden, und ich möchte sie vermeiden, weil sie sehr kostspielig ist, aber darum geht es nicht.

Gibt es eine Möglichkeit, diesen Code auszuführen, ohne den JIT machen kann werfen ein TypeAccessException (wie wenn Sie eine dynamische Methode aufrufen, die Sie true zum skipVerification Parameter, um es den Konstruktor übergeben)?

+1

Möglicherweise verwandte je nachdem, was diese Methode ist für: http://stackoverflow.com/questions/10183619/how-to-determine-if-a-type-is-of-runtimetype –

+1

ist nicht das, was Ich frage, das ist nur eine Methode, die ich mit IL-Code implementieren möchte, der nicht-öffentliche Mitglieder und Typen verwendet. Ich habe mehr Dinge im Sinn, wie zum Beispiel die Implementierung meiner eigenen 'GetMethods' und' GetFields' usw. basierend auf der Reflektion von .NET. Dieser Aufruf erfordert 'System.RuntimeType.ListBuilder'1 .ToArray' und einige andere nicht-öffentliche Sachen. Ich möchte nur wissen, wie man das mit reinem IL-Code macht. Sicher kann ich dynamische Methoden oder etwas verwenden (das ist, was ich gerade mache, und ich bin nicht damit glücklich), aber das fehlt der ganze Punkt. Ich mache es für mich selbst, um zu lernen und Spaß zu haben. – boaz23

+1

Dumme Frage: Dies kann in C# getan werden, warum nicht einfach diese Methode schreiben? Edit: Ich muss @ JeroenMostert hier zustimmen. – leppie

Antwort

0

Unabhängig davon, ob die Verifizierung aktiviert ist oder nicht, können Sie die Barrierefreiheit des Typs oder die Sichtbarkeit der Elemente nicht verletzen, selbst wenn Sie CIL direkt verwendet haben. Dies ist eine Frage der Korrektheit des CIL-Codes, nicht nur der Typ-Sicherheit. Dies ist der richtige Weg, um zu überprüfen, ob ein gegebenes Objekt eine Instanz von RuntimeType ist.

static bool IsTypeRuntimeType(Type type) 
{ 
     return typeof(object).GetType() == type.GetType(); 
} 
+0

Wie boaz23 in der Frage erwähnt hat, gibt es einige Überladungen der 'DynamicMethod' Klasse, die die Barrierefreiheitsregeln verletzen können. Er stellt auch fest, dass der IL-Code nur ein Beispiel ist und keine Sache, für die er einen Workaround benötigt. – thehennyy

+0

@thehennyy Das OP erklärte in den Kommentaren, er wolle reines IL verwenden. Der Code, den ich gezeigt habe, ist reines IL, es sei denn, er meint, keine Methoden aufzurufen, was ohne die Verwendung von nicht verwalteten Zeigern nicht möglich ist. –

+0

@thehennyy 'DynamicMethod' ist Teil der Reflection-APIs, die per Definition die Aufzählung aller Typen und aller Member ermöglichen und abhängig von den gewährten Reflection Security-Berechtigungen einige Typen und Member aufrufen oder verwenden. –