2011-04-08 15 views
8

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?

+0

¿Qué quiere decir con "with in memory option"? ¿Has intentado simplemente conectar el depurador al proceso en ejecución? –

+1

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

Respuesta

7

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 
+0

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

+0

+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. –

+0

@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

0

¿Intentó adjuntar al proceso utilizando su código de la función Depurar> Adjuntar para procesar en VS?

3

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.

Cuestiones relacionadas