2009-11-15 18 views
7

He construido algunos tipos dinámicamente usando System.CodeDom.CodeCompileUnit, quiere compilar los IL en código en la memoria, e inyectar ese código IL en un conjunto cargado en la memoria - no hay necesidad de ahorrar algo de esto en el disco. Tal vez mi plan declarado es incorrecto. Abierto a otras sugerencias sobre cómo obtener esa instancia de CodeCompileUnit en dicho destino.¿Cómo puedo emitir código e inyectarlo en un ensamblaje cargado?

+1

¿Por qué necesita inyectar los tipos en un conjunto ya cargado? ¿Por qué no puedes inyectarlos en un conjunto que estás construyendo actualmente? – yfeldblum

+1

@Justice: Ese es un buen punto, es una curiosidad más que nada. Supongo que si tuviera que idear escenarios, los posibles son: esquivar los permisos del sistema de archivos para construir ensambles simplemente trabajando en la memoria; o tal vez para inyectar código en un ensamblado e invocarlo dinámicamente para inspeccionar cosas sin la necesidad de recompilar la aplicación. –

+0

No estoy seguro de que haya una manera de hacer esto. Si hay, me gustaría saber también. –

Respuesta

7

Usted puede inyectar código en un existente (ya cargado) conjunto usando ICorDebug interfaces. Editar y Continuar lo hace.

calcular sus bytes delta y llaman ICorDebugModule2::ApplyChanges. Vea el MDbg sample code para más detalles.

Erase una vez que utilizamos ICorDebugModule::GetEditAndContinueSnapshot y amigos, pero estos ahora están en desuso.

actualización Si no se preocupan por la inyección de código en una asamblea ya cargado, simplemente usando Reflection.Emit para crear un nuevo conjunto es más eficiente y mucho más fácil.

+0

Esta solución responde directamente a la pregunta. Gracias. –

1

También puede utilizar System.Reflection.Emit espacio de nombres y crear un ensamblado dinámico en memoria.

alternativa es utilizar CodeDom para generar & código de compilación, a continuación, poner en él.

XMLSerialization() hace esto último.

1

Puede usar Mono.Cecil para manipular IL. Es una herramienta poderosa, aunque de alguna manera carece de documentación.

Cuestiones relacionadas