2009-09-29 7 views
12

Al generar IL usando DynamicMethod es posible llamar a los métodos y campos de acceso que de otro modo serían no-accesible si se proporciona 'verdadero' para el parámetro restrictedSkipVisibility en el DynamicMethod constructor¿Es posible omitir las comprobaciones de visibilidad cuando se genera IL dinámico con MethodBuilder?

yo preferiría para emitir dinámica IL en un conjunto dinámico en su lugar, así puedo guardar el IL generado en un ensamblado en tiempo de compilación. Si uso este método, tengo que usar un MethodBuilder en lugar de un DynamicMethod. Sin embargo, necesito poder omitir las comprobaciones de visibilidad para no obtener MethodAccessException cuando ejecuto mi código dinámico. ¿Hay alguna manera de hacer esto y, si es así, cómo?

+0

¿Se solucionó este problema? ¿Puede describir brevemente cómo lo resolvió? – kizzx2

+0

No. Por lo que yo sé, no se puede resolver. Terminé adoptando otro enfoque para la solución al usar la biblioteca Mono.Cecil para volver a escribir el ensamblaje. De esta forma pude acceder a miembros privados o internos sin violar las reglas de seguridad tipo. Sin embargo, con ese método no pude conseguir que los símbolos coincidan correctamente con los archivos de origen que causaron otras molestias. –

Respuesta

2

Al utilizar MethodBuilder en un conjunto dinámico, está sujeto a las mismas reglas que los ensamblados generados por el compilador. Por lo tanto, la visibilidad entre ensamblados se rige por:

Lea la documentación y las muestras para ver si se ajustan a sus necesidades.

0

si necesita materializar el código generado por interfaz en lugar de delegar, será útil omitirVisibilityCheck para unModelbuilder. No encontré la manera de hacerlo directamente, pero puedes llamar un método dinámico en tu MethodBuilder usando EmitCalli (OpCodes.Calli ...).

Cuestiones relacionadas