Tengo la necesidad de compilar un código usando CodeDomProvider.CompileAssemblyFromSource
. ¿Cómo podría uno depurarlo? Básicamente, quiero compilarlo, crear una instancia de un tipo y luego ingresar al código del tipo.¿Es posible depurar código compilado en tiempo de ejecución?
Respuesta
Después de publicar una pregunta, me di cuenta de que mi problema era que estaba generando el ensamblado de una cadena, no de un archivo. Volví y cambié el código para ejecutarlo con diferentes opciones cuando estuve en DEPURACIÓN y puedo entrar directamente desde el código de prueba de la unidad. También uno tiene que establecer GenerateInMemory en falso e IncludeDebugInformation en verdadero.
#if DEBUG
@params.IncludeDebugInformation = compilationContext.IncludeDebugInformation;
@params.GenerateInMemory = compilationContext.GenerateInMemory;
var fileName = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\..\" + compilationContext.AssemblyOutputName + ".cs"));
File.WriteAllText(fileName,compilationContext.StringToCompile);
return _codeDomProvider.CompileAssemblyFromFile(@params,fileName);
#else
return _codeDomProvider.CompileAssemblyFromSource(@params, compilationContext.StringToCompile);
#endif
Observación interesante, el ensamblado generado así no tiene que terminar con dll para ser utilizable, no lo hace tiene que tener cualquier extensión. – epitka
+1 Buena pregunta y auto-respuesta y muy a propósito para mí. Estoy en el medio de generar y compilar código de prueba sobre la marcha. Esto es útil. –
@Wilkins: Gracias, me alegro de que haya ayudado a alguien más. Mis cosas están incluso más involucradas, genero código que genera código que luego se compila y ejecuta. Por lo tanto, ser capaz de depurar era imprescindible para mí aquí. – epitka
¿Intentó adjuntar al proceso utilizando su código de la función Depurar> Adjuntar para procesar en VS?
Interesante pregunta. Creo que su mejor opción sería usar WinDbg para adjuntarlo al proceso ejecutable .NET exe (creo que tendrá que hacer esto después de que el tyoe se haya compilado en la memoria, ya que las direcciones de memoria para el EXE cambiarán, supongo) .
Luego, cuando el tipo se compila y se ejecuta en la memoria, puede buscar ese tipo utilizando los comandos que se encuentran en SOS.dll. También puede colocar puntos de interrupción en la memoria utilizando Sos.dll
cómo empezar con enlace SOS
http://rionisimpsoni.wordpress.com/2009/10/08/getting-started-with-windbg-and-sos-dll/
Esto es un poco de luz respuesta, ya que explica cómo utilizar WinDbg y tiene Sos.dll sido cubierto muchas veces en la web.
Editar:
Una de las desventajas de este método es que usted no será capaz de ver el código fuente como Visual Studio muestra. Verá que se muestra el lenguaje ensamblador mientras recorre el código. Esto podría desanimarlo :), pero si se mantiene y comprende un poco el ensamblaje, podría hacer lo suficiente para solucionar errores, por ejemplo.
Otra cosa que podría hacer es volcar el ensamblado .NET de la memoria en un archivo en el disco. El comando SOS.dll para hacer eso se me escapa ahora, lo buscaré ...
Ahh, es SaveModule
. Un ejemplo de esto se puede encontrar en los comentarios here.
- 1. Cómo depurar/romper código codificado compilado
- 2. Cómo depurar el código compilado de Java en Eclipse
- 3. ¿Puedo depurar un ensamblado compilado?
- 4. ¿Es posible agregar ruta en tiempo de ejecución en MVC3?
- 5. ¿Es posible depurar Global.asax?
- 6. ¿Es posible usar condicionalmente XPManifest en tiempo de ejecución?
- 7. ¿es posible anular un método en tiempo de ejecución?
- 8. ¿Es posible cambiar app.config en tiempo de ejecución?
- 9. ¿Es posible importar un archivo python compilado?
- 10. ¿Es posible compilar y ejecutar código nuevo en tiempo de ejecución en .NET?
- 11. ¿Es posible validar xml contra xsd usando código en tiempo de ejecución?
- 12. ¿Cómo depurar las bibliotecas compartidas en tiempo de ejecución?
- 13. Cambio de código en tiempo de ejecución
- 14. ¿Es posible que JIT inline inserte mi código en algún código de ensamblado en tiempo de ejecución de .NET?
- 15. Ejecución del código de tiempo en Android
- 16. cargar código python en tiempo de ejecución
- 17. Cómo depurar el código IL generado en tiempo de ejecución utilizando Reflection.Emit
- 18. ¿Cómo depurar un programa compilado con 'make'?
- 19. nodejs: ¿Es posible evaluar el código js usando runInNewContext y limitar su tiempo de ejecución por un tiempo de espera?
- 20. FederatedAuthentication.WSFederationAuthenticationModule es nulo en tiempo de ejecución
- 21. ¿Es posible crear una función de forma dinámica durante el tiempo de ejecución en C++?
- 22. código compilado impar
- 23. ¿Es posible depurar múltiples hilos en eclipse en diferentes ventanas?
- 24. ¿Cómo usar Netbeans para depurar el código compilado usando el build.xml personalizado de Ant?
- 25. Generar, compilar y usar código Java en tiempo de ejecución?
- 26. ¿Es posible modificar un cuerpo de método en tiempo de ejecución en .NET?
- 27. ¿Puedo llamar a la función de tiempo de ejecución de CUDA desde el código de C++ no compilado por nvcc?
- 28. C# Tamaño del código y tiempo de ejecución del código
- 29. ¿Es posible obtener un resumen de clase en tiempo de ejecución?
- 30. Inyectando código en ejecutable en tiempo de ejecución
¿Qué quiere decir con "with in memory option"? ¿Has intentado simplemente conectar el depurador al proceso en ejecución? –
Si bien esto no puede ser lo que desea, ¿qué hay de simplemente generar el ensamblaje en el disco y cargarlo como si fuera un ensamblaje existente, solo para fines de depuración? Entiendo la necesidad de generar el ensamblado en tiempo de ejecución, pero no hay nada de malo en elegir ciertas condiciones de tiempo de ejecución y reproducirlas en tiempo de compilación :) – OregonGhost