2010-06-15 24 views
7

Estoy buscando una manera de filtrar los métodos que tienen el modificador unsafe a través de la reflexión. No parece ser un atributo de método.Determinar si el método no es seguro a través de la reflexión

¿Hay alguna manera?

EDIT: Parece que esta información no está en los metadatos, al menos no puedo verla en la IL. Sin embargo, el reflector muestra el modificador unsafe en la vista C#. ¿Alguna idea sobre cómo se hace?

EDIT 2: Para mis necesidades terminé con una comprobación, que supone que si uno de los parámetros del método es un puntero, o un tipo de devolución es un puntero, entonces el método no es seguro.

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

Esto no maneja, por supuesto, una situación en la que se ejecuta un bloque inseguros dentro de un método, pero de nuevo, todo lo que me interesa es la firma del método.

Gracias!

+0

¿Cuál es la razón para querer hacer esto? Tal vez hay una alternativa. – GenericTypeTea

+0

@GenericTypeTea Estoy haciendo algo de generación de código a través de CodeDom. No es compatible con la generación de la palabra clave 'inseguro', por lo que me gustaría ignorar los tipos que tienen métodos' inseguros'. –

+0

Supongo que la palabra clave insegura es solo una bandera que le dice al compilador: no genere un error de compilación aquí porque tenía la intención de usar un código no seguro. Reflector probablemente detecta el código inseguro y luego agrega la palabra clave. Noté que si usa un bloque inseguro en un método "seguro", la palabra clave insegura en Reflector se genera en la declaración del método, por lo que no genera un bloque para eso. Así que la respuesta aquí es: si Reflector puede detectar código inseguro en mscorlib, también puede ... – Koen

Respuesta

4

Desafortunadamente, la palabra clave insegura simplemente ajusta el cuerpo del método en un bloque inseguro y no emite nada que la reflexión vería. La única manera de estar seguro es desmontar el método y ver si hay alguna operación insegura dentro.

+0

También pensaría que si pudiera verlo con reflexión, tendrían una propiedad para nosotros en MethodInfo ... – Koen

+1

sea ​​agradable, pero desafortunadamente la palabra clave insegura es una cosa C#, no una cosa IL. IL tiene operaciones inseguras, pero no tiene el concepto de la palabra clave insegura. –

+0

Gracias, Adam. Estoy aceptando esta respuesta porque esta es la conclusión a la que llegué. –

0

No crea que hay una manera de salir de la caja. Si el código que está reflejando es suyo, puede crear su propio UnsafeAttribute y etiquetar esos métodos con el atributo y filtro en ese ...

+0

Gracias, pero en realidad estoy tratando de filtrar nuestros tipos 'mscorlib' ... –

2

Ese es el trabajo de un verificador de IL. PEVerify.exe en el directorio bin de Windows SDK. Verifica el IL en los cuerpos del método y señala IL no seguro. Punteros, en su mayoría. Obtendrá una lista bastante grande si la suelta en el ensamblado system.dll.

Tenga en cuenta que se niega a verificar mscorlib.dll, usted está bastante atascado si ese es el que le importa. Copiar y renombrarlo no ayuda.

Cuestiones relacionadas