2016-04-26 10 views
4

Я пытаюсь вызвать следующий метод 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 

'TypeAccessException' that is occured when calling the method

Да, я знаю о проверке 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)?

+1

Возможно, связанные в зависимости от того, что этот метод для: http://stackoverflow.com/questions/10183619/how-to-determine-if-a-type-is-of-runtimetype –

+1

Это не то, что Я спрашиваю, это всего лишь один метод, который я хочу реализовать с помощью IL-кода, который использует непубличные элементы и типы. У меня есть больше вещей, таких как реализация собственных 'GetMethods' и' GetFields' и т. Д., Основанных на отражении .NET. Для этого вызова требуется 'System.RuntimeType.ListBuilder'1 .ToArray' и некоторые другие негосударственные вещи. Я просто хочу знать, как это сделать с помощью чистого кода IL. Конечно, я могу использовать динамические методы или что-то (это то, что я делаю прямо сейчас, и я не доволен этим), но этого не хватает. Я делаю это для себя, чтобы учиться и веселиться. – boaz23

+1

Глупый вопрос: Это можно сделать на C#, почему бы просто не написать этот метод? Изменить: Я должен согласиться с @JeroenMostert здесь. – leppie

ответ

0

Независимо от того, включена ли проверка или нет, вы не можете нарушать доступность типа или видимость элемента, даже если вы использовали CIL напрямую. Это вопрос правильности кода CIL, а не только безопасности типа. Это правильный способ проверить, является ли данный объект типа экземпляром RuntimeType.

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

Как упоминалось в вопросе boaz23, есть некоторые перегрузки класса 'DynamicMethod', которые могут нарушать правила доступности. Также он утверждает, что код IL - это всего лишь пример, а не то, для чего ему нужно обходное решение. – thehennyy

+0

@thehennyy OP заявила в комментариях, что хочет использовать чистый IL. Код, который я показал, является чистым ИЛ, если он не означает, что он не вызывает никаких методов, которые невозможны без использования неуправляемых указателей. –

+0

@thehennyy 'DynamicMethod' является частью API-интерфейсов отражения, которые по определению позволяют перечислять все типы и все члены и вызывать или использовать некоторые типы и элементы в зависимости от предоставленных разрешений безопасности отражения. –