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
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 mitSecurityAction.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)?
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 –
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
Dumme Frage: Dies kann in C# getan werden, warum nicht einfach diese Methode schreiben? Edit: Ich muss @ JeroenMostert hier zustimmen. – leppie