8

我正在寻找一种方法来过滤掉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;
    }

当然,这不能处理在方法中执行不安全块的情况,但同样,我感兴趣的只是方法签名。

谢谢!

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 回答