代码之家  ›  专栏  ›  技术社区  ›  Igal Tabachnik

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

  •  7
  • Igal Tabachnik  · 技术社区  · 14 年前

    unsafe 通过反射进行修改。它似乎不是方法属性。

    有办法吗?

    似乎这些信息不在元数据中,至少我在IL中看不到。然而,反射器显示 不安全的 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 回复  |  直到 14 年前
        1
  •  5
  •   Adam Ruth    14 年前

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

        2
  •  2
  •   Hans Passant    14 年前

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

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

        3
  •  0
  •   Koen    14 年前

    别以为有办法跳出框框。如果您反映的代码是您的,那么您可以创建自己的代码 UnsafeAttribute