8

unsafeリフレクションを介して修飾子を持つメソッドを除外する方法を探しています。メソッド属性ではないようです。

方法はありますか?

編集:この情報はメタデータにないようです。少なくとも、IL には表示されません。ただし、リフレクターはunsafeC# ビューで修飾子を表示します。それがどのように行われたかについてのアイデアはありますか?

EDIT 2:私のニーズのために、メソッドのパラメーターの1つがポインターである場合、または戻り値の型がポインターである場合、メソッドは安全ではないことを前提としたチェックになりました。

    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;
    }

もちろん、これは安全でないブロックがメソッド内で実行される状況を処理しませんが、繰り返しになりますが、私が関心を持っているのはメソッド シグネチャだけです。

ありがとう!

4

3 に答える 3

5

残念ながら、unsafe キーワードは単にメソッドの本体を unsafe ブロックでラップするだけで、リフレクションが参照するものは何も出力しません。確実にする唯一の方法は、メソッドを逆アセンブルし、安全でない操作が内部にないかどうかを確認することです。

于 2010-06-15T11:32:55.997 に答える
2

それが IL 検証者の仕事です。Windows SDK の bin ディレクトリにある PEVerify.exe。メソッド本体の IL を検証し、安全でない IL にフラグを立てます。主にポインター。system.dll アセンブリで解放すると、かなり大きなリストが得られます。

mscorlib.dll の検証を拒否していることに注意してください。コピーして名前を変更しても役に立ちません。

于 2010-06-15T11:33:07.197 に答える
0

箱から抜け出す方法があるとは思わないでください。反映しているコードが自分のものである場合は、独自のコードを作成し、UnsafeAttributeそれらのメソッドに属性でタグを付けて、それをフィルター処理できます...

于 2010-06-15T11:12:39.277 に答える