Я пытаюсь вызвать следующий метод MSIL:
.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
Однако это исключение возникает при попытке выполнить строку:
isinst [mscorlib]System.RuntimeType
Да, я знаю о JIT-проверке, но я пробовал много вещей, и они не работали, или, может быть, я просто делал их неправильно, я не уверен. Кроме того, я не мог найти много по этой теме.
Я пробовал следующее (в сочетании некоторых из них вместе):
- Добавьте в метод атрибут
[SecurityPermissionAttribute(SecurityAction.Demand, SkipVerification = true)]
(также сSecurityAction.Assert
) - Звонок
new ReflectionPermission(ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.RestrictedMemberAccess).Demand();
(а также.Assert()
) - Звонок
new SecurityPermission(SecurityPermissionFlag.AllFlags).Demand();
(а также.Assert()
)
Ни один из этих требовательных и утверждающих не стал исключением.
Чтобы уточнить, это всего лишь пример. Основная идея — заставить код работать и обойти JIT-проверку. Этот конкретный метод не может быть выполнен в C# без размышлений, и я хочу избежать его, потому что это очень дорого, но это не главное.
Есть ли способ заставить этот код выполняться без JIT, выбрасывающего TypeAccessException
(например, когда вы вызываете динамический метод, который вы передали true
параметру skipVerification
его конструктору)?
GetMethods
иGetFields
и т. д. на основе отражения .NET. Для этого вызова требуетсяSystem.RuntimeType.ListBuilder'1<T>.ToArray
и некоторые другие непубличные вещи. Я просто хочу знать, как это сделать с помощью чистого IL-кода. Конечно, я могу использовать динамические методы или что-то в этом роде (это то, что я делаю прямо сейчас, и я не доволен этим), но это упускает из виду весь смысл. Я делаю это для себя, чтобы учиться и получать удовольствие. - person boaz23   schedule 27.04.2016