通过反射确定方法是否不安全

时间:2010-06-15 11:03:44

标签: c# reflection unsafe

我正在寻找一种方法来过滤掉通过反射具有unsafe修饰符的方法。它似乎不是方法属性。

有办法吗?

编辑:似乎此信息不在元数据中,至少我在IL中看不到它。但是,反射器在C#视图中显示unsafe修饰符。关于它是如何完成的任何想法?

编辑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 个答案:

答案 0 :(得分:4)

不幸的是,unsafe关键字只是将方法的主体包装在一个不安全的块中,并且不会发出反射会看到的任何内容。唯一可以确定的方法是反汇编方法,看看里面是否有任何不安全的操作。

答案 1 :(得分:2)

这是IL验证者的工作。 Windows SDK的bin目录中的PEVerify.exe。它验证方法体中的IL并标记不安全的IL。指针,主要是。如果你在system.dll程序集上放松它,你会得到一个相当大的列表。

请注意,它拒绝验证mscorlib.dll,如果那是你关心的那个,你就会陷入困境。复制和重命名它没有用。

答案 2 :(得分:0)

不要认为开箱即用。如果您反映的代码是您的代码,则可以创建自己的UnsafeAttribute并使用该属性标记这些方法并对其进行过滤...