Определить, если метод небезопасен с помощью отражения - PullRequest
7 голосов
/ 15 июня 2010

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

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 15 июня 2010

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

2 голосов
/ 15 июня 2010

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

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

0 голосов
/ 15 июня 2010

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

...