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?
Respuesta
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.
Esta solución responde directamente a la pregunta. Gracias. –
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.
Puede usar Mono.Cecil para manipular IL. Es una herramienta poderosa, aunque de alguna manera carece de documentación.
- 1. Cómo encontrar un método en el código de ensamblaje
- 2. Código de ensamblaje en C++
- 3. Cómo emitir un pitido en vim
- 4. iOS código de ensamblaje
- 5. ¿Cómo puedo transportar una imagen en ensamblaje?
- 6. ¿Cómo puede objdump emitir sintaxis intel
- 7. ¿Puedo cambiar las líneas de código en un módulo cargado en Perl?
- 8. F # Cómo compilar una cita de código para un ensamblaje
- 9. Cómo emitir dos instancias del mismo cargador de clases cargado diferente?
- 10. ¿Cómo puedo verificar si un complemento jQuery está cargado?
- 11. ¿Puede Mono.Cecil modificar el código ya cargado en el dominio de la aplicación?
- 12. ¿Cómo puedo detectar si un control ActiveX está cargado?
- 13. Cómo puedo emitir un número entero a un id en IOS
- 14. ¿Cómo puedo detectar si un iframe está cargado?
- 15. cómo emitir un "show dbs" de pymongo
- 16. ¿Cómo puedo saber si realmente cambió un "ensamblaje"?
- 17. ¿Cómo puedo obtener el contenido del archivo cargado en php?
- 18. ¿Cómo puedo examinar el ensamblaje en Xcode 4?
- 19. CSS condicional no cargado por IE7 e IE8
- 20. ¿Cómo puedo traducir el ensamblaje a binario?
- 21. ¿emitir o convertir un flotador a nvarchar?
- 22. ¿Cómo puedo procesar un archivo cargado a través de un formulario HTML en Spray/Scala/Java?
- 23. Cómo emitir un 'hallazgo' o 'dónde' que genera un RecordNotFound
- 24. Depurar el ensamblado cargado dinámicamente en Visual Studio .NET
- 25. Ingeniería inversa C-código fuente del ensamblaje
- 26. ¿Cómo se resuelve un ensamblaje en .NET?
- 27. Descifrando y comprendiendo el código de ensamblaje
- 28. ¿Cómo emitir listas genéricas dinámicamente en C#?
- 29. Emitir un tipo anónimo en Objeto y recuperar un campo
- 30. ¿Puedo usar C# y C++/CLI en un solo ensamblaje?
¿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
@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. –
No estoy seguro de que haya una manera de hacer esto. Si hay, me gustaría saber también. –