Я ищу способ отфильтровать методы, которые имеют unsafe
модификатор через отражение. Это, кажется, не атрибут метода.
Существует ли путь?
Править: кажется, что эта информация не находится в метаданных, по крайней мере, я не вижу его в IL. Однако отражатель показывает unsafe
модификатор в представлении C#. Какие-либо идеи о том, как это сделано?
РЕДАКТИРОВАНИЕ 2: Для моих потребностей я закончил с проверкой, которая предполагает, что, если один из параметров метода является указателем, или тип возврата является указателем, то метод небезопасен.
public static bool IsUnsafe(this MethodInfo methodInfo)
{
if (HasUnsafeParameters(methodInfo))
{
return true;
}
return methodInfo.ReturnType.IsPointer;
}
private static bool HasUnsafeParameters(MethodBase methodBase)
{
var parameters = methodBase.GetParameters();
bool hasUnsafe = parameters.Any(p => p.ParameterType.IsPointer);
return hasUnsafe;
}
Это не обрабатывает, конечно, ситуацию, где небезопасный блок выполняется в рамках метода, но снова, все, которое я интересуюсь, сигнатура метода.
Спасибо!
К сожалению, ключевое слово unsafe просто помещает тело метода в небезопасный блок и не генерирует ничего, что могло бы увидеть отражение. Единственный способ быть уверенным - разобрать метод и посмотреть, нет ли внутри небезопасных операций.
Это работа верификатора IL. PEVerify.exe в каталоге bin пакета Windows SDK. Он проверяет IL в телах методов и помечает небезопасный IL. В основном указатели. Вы получите довольно большой список, если пустите его в сборку system.dll.
Обратите внимание, что он отказывается проверять mscorlib.dll, вы сильно застряли, если это тот, который вам нужен. Копирование и переименование не помогает.
Не думайте, что есть выход из коробки. Если код, который вы отражаете, принадлежит вам, вы можете создать свой собственный UnsafeAttribute
и пометить эти методы атрибутом и фильтром для этого ...