2010-05-02 15 views
9

Quiero agregar cierto comportamiento a una cierta clase en tiempo de ejecución. Sé cómo subclasificar en tiempo de ejecución usando Reflection.Emit, pero eso no es suficiente, dependiendo de alguna configuración externa, necesito inyectar códigos de operación en un método en un tipo T para que todas las clases que hereden de él ganen automáticamente este comportamiento. (No puedo usar el .NET Profiling API)¿Puede Mono.Cecil modificar el código ya cargado en el dominio de la aplicación?

¿Se puede hacer algo como esto con Mono.Cecil?

Si no es posible modificar el código en un conjunto cargado, está bien si puedo hacer las modificaciones antes de cargar el ensamblaje y luego cargar el ensamblaje modificado en la memoria, pero no sé cómo puedo controlar la carga del ensamblaje.

+0

¿Está preguntando porque quiere optimizar el código? ¿Está abierto a la idea del muestreo como alternativa a la instrumentación? Mucha gente cree en la instrumentación porque es "precisa", que no es lo que necesita para la optimización. Si desea optimizar, considere este método: http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024 –

+0

No es la optimización Estoy buscando, lo que quiero es agregar algún comportamiento a un marco basado en la configuración. Por ejemplo, tome el mecanismo de inspección TypeDescriptor, si leo alguna configuración y agrego alguna propiedad pública a una clase base T, entonces quien inspeccione T o cualquiera de sus subclases utilizando el mecanismo TypeDescriptor verá la propiedad, pero si se realiza la misma inspección utilizando la reflexión, la propiedad se perderá. Eso es porque el Tipo no se modifica realmente, la propiedad simplemente se agrega en el contexto de la inspección de TypeDescriptor. –

Respuesta

6

No, Cecil no puede modificar un conjunto cargado. Debe instrumentar los ensamblajes antes de que se carguen realmente.

No tiene mucho control sobre cómo se resuelven los ensamblajes. Puede enganchar en AppDomain.AssemblyResolve si oculta los ensamblajes en una carpeta privada suya e insértelos antes de cargarlos.

+0

Eso es lo que necesito, no sabía de este evento, gracias. –

1

Como dice JB arriba- Puede crear un controlador de eventos de resolución, que sería como PSeudoHooking. Y antes de que se cargue el ensamblaje, usted realiza los cambios, y luego una vez que se realizan los cambios, el ensamblaje de resolución continúa para cargar el ensamblaje modificado.

Utilizo este método para resolver embebidos Dll de secuencias de memoria.

Cuestiones relacionadas