Определите, небезопасен ли метод через отражение

Я ищу способ отфильтровать методы, которые имеют 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;
    }

Это не обрабатывает, конечно, ситуацию, где небезопасный блок выполняется в рамках метода, но снова, все, которое я интересуюсь, сигнатура метода.

Спасибо!

8
задан Igal Tabachnik 16 June 2010 в 07:16
поделиться

3 ответа

К сожалению, ключевое слово unsafe просто помещает тело метода в небезопасный блок и не генерирует ничего, что могло бы увидеть отражение. Единственный способ быть уверенным - разобрать метод и посмотреть, нет ли внутри небезопасных операций.

5
ответ дан 5 December 2019 в 21:16
поделиться

Это работа верификатора IL. PEVerify.exe в каталоге bin пакета Windows SDK. Он проверяет IL в телах методов и помечает небезопасный IL. В основном указатели. Вы получите довольно большой список, если пустите его в сборку system.dll.

Обратите внимание, что он отказывается проверять mscorlib.dll, вы сильно застряли, если это тот, который вам нужен. Копирование и переименование не помогает.

2
ответ дан 5 December 2019 в 21:16
поделиться

Не думайте, что есть выход из коробки. Если код, который вы отражаете, принадлежит вам, вы можете создать свой собственный UnsafeAttribute и пометить эти методы атрибутом и фильтром для этого ...

0
ответ дан 5 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: