Я пытаюсь вызвать следующий метод MSIL:C# в сочетании с MSIL - JIT Пропустить Проверка
.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
) - Calling
new ReflectionPermission(ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.RestrictedMemberAccess).Demand();
(а также.Assert()
) - Вызов
new SecurityPermission(SecurityPermissionFlag.AllFlags).Demand();
(а также.Assert()
)
Отсутствует Это требование требовало и утверждало исключение.
Чтобы уточнить это, это просто пример. Основная идея - заставить код работать и обходить проверку JIT. Этот конкретный метод не может быть выполнен на C# без отражения, и я хочу его избежать, потому что это очень дорого, но дело не в этом.
Есть ли способ, что я могу сделать этот код выполнить без JIT бросание TypeAccessException
(например, при вызове динамического метода, который вы передаёте true
параметру в это конструктор skipVerification
)?
Возможно, связанные в зависимости от того, что этот метод для: http://stackoverflow.com/questions/10183619/how-to-determine-if-a-type-is-of-runtimetype –
Это не то, что Я спрашиваю, это всего лишь один метод, который я хочу реализовать с помощью IL-кода, который использует непубличные элементы и типы. У меня есть больше вещей, таких как реализация собственных 'GetMethods' и' GetFields' и т. Д., Основанных на отражении .NET. Для этого вызова требуется 'System.RuntimeType.ListBuilder'1 .ToArray' и некоторые другие негосударственные вещи. Я просто хочу знать, как это сделать с помощью чистого кода IL. Конечно, я могу использовать динамические методы или что-то (это то, что я делаю прямо сейчас, и я не доволен этим), но этого не хватает. Я делаю это для себя, чтобы учиться и веселиться. –
boaz23
Глупый вопрос: Это можно сделать на C#, почему бы просто не написать этот метод? Изменить: Я должен согласиться с @JeroenMostert здесь. – leppie