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

C# 通过反射确定方法是否不安全,c#,reflection,unsafe,C#,Reflection,Unsafe,我正在寻找一种方法,通过反射过滤掉带有不安全修饰符的方法。它似乎不是一个方法属性 有办法吗 编辑:元数据中似乎没有此信息,至少我在IL中看不到它。但是,reflector在C#视图中显示了不安全修饰符。有什么办法吗 编辑2:出于我的需要,我最后做了一个检查,假设如果该方法的一个参数是指针,或者返回类型是指针,那么该方法是不安全的 public static bool IsUnsafe(this MethodInfo methodInfo) { if (HasUns

我正在寻找一种方法,通过反射过滤掉带有
不安全
修饰符的方法。它似乎不是一个方法属性

有办法吗

编辑:元数据中似乎没有此信息,至少我在IL中看不到它。但是,reflector在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;
    }
当然,这并不能处理在方法中执行不安全块的情况,但我感兴趣的是方法签名


谢谢

别以为有什么办法可以摆脱束缚。如果您要反映的代码是您自己的,您可以创建自己的
unsafeature属性
,并在这些方法上标记属性和过滤器…

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

这是IL验证器的工作。Windows SDK的bin目录中的PEVerify.exe。它验证方法体中的IL并标记不安全的IL。大部分是指针。如果在system.dll程序集中释放它,您将得到一个相当大的列表


请注意,它拒绝验证mscorlib.dll,如果您所关心的是mscorlib.dll,那么您将陷入困境。复制和重命名它没有帮助。

想这样做的原因是什么?也许还有另一种方法。@GenericTypeTea我正在通过CodeDom生成代码。它不支持生成
unsafe
关键字,因此我想忽略具有
unsafe
方法的类型。我猜unsafe关键字只是一个对编译器说:不要在这里生成编译错误的标志,因为我打算使用不安全的代码。Reflector可能会检测到不安全的代码,然后添加关键字。我注意到,如果在“safe”方法中使用不安全的块,那么Reflector中的unsafe关键字将在方法声明中生成,因此它不会为此生成块。所以这里的答案是:如果Reflector可以检测mscorlib中的不安全代码,那么您也可以……Resharper也能够检测不安全操作,因为它将根据这些操作对代码着色。例如,你可以寻找指针解引用的字节码。我还认为,如果你能通过反射看到它,他们会在MethodInfo上为我们提供一个属性……这很好,但不幸的是,不安全关键字是C#的东西,而不是IL的东西。IL有不安全的操作,但没有不安全关键字的概念。谢谢你,亚当。我接受这个答案,因为这是我自己得出的结论。