2009-05-17 17 views
19

Tengo una aplicación que carga los archivos fuente C# dinámicamente y los ejecuta como complementos. Cuando ejecuto la aplicación principal en modo de depuración, ¿es posible depurar en el ensamblaje dinámico? Obviamente, establecer puntos de interrupción es problemático, ya que la fuente no es parte del proyecto original, pero ¿debería ser capaz de intervenir o romper las excepciones para el código?Cómo depurar/romper código codificado compilado

¿Hay alguna forma de codificar para generar PDB para esto o algo así?

Aquí está el código que estoy usando para la compilación dinámica.

CSharpCodeProvider codeProvider = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } }); 
//codeProvider. 
ICodeCompiler icc = codeProvider.CreateCompiler(); 

CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.GenerateInMemory = true; 
parameters.CompilerOptions = string.Format("/lib:\"{0}\"", Application.StartupPath); 
parameters.ReferencedAssemblies.Add("System.dll"); 
parameters.ReferencedAssemblies.Add("System.Core.dll"); 


CompilerResults results = icc.CompileAssemblyFromSource(parameters, Source); 
DLL.CreateInstance(t.FullName, false, BindingFlags.Default, null, new object[] { engine }, null, null); 
+0

Por curiosidad (nunca me he equivocado con las cosas de CodeDom) qué pasa si intentas poner System.Diagnostics.Debugger.Break(); en algún lugar de tu código? ¿Puedes entrar? – BFree

+0

esto funcionó, pero solo con las opciones en la respuesta aceptada. –

+0

Dupliqué esta pregunta por inadvertencia (el codificado no fue la clave que busqué). http://stackoverflow.com/questions/1593920/debugging-a-generated-net-assembly-from-within-the-application-that-generated-it/1594910#1594910. Agregué una solución que implica una interfaz. Espero que ayude ... – jdehaan

Respuesta

31

Pruebe las siguientes opciones:

parameters.GenerateInMemory = false; //default 
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true); 
parameters.IncludeDebugInformation = true; 

No estoy seguro de si esto funciona bien en tu caso, pero si lo hace, se puede rodear con esos parámetros con directiva de compilación condicional, de modo que los vertederos el ensamblaje generado solo en modo de depuración.

+2

Es 2,42 años después, pero usted señor, ¡es IMPRESIONANTE! – Philip

+0

Me salvó el tiempo para averiguar el problema :) – superachu

7

El answer by @bbmud es correcto, aunque omite una corrección de error. El CSharpCodeGenerator (la clase en .NET que compila el código C# a IL) está configurado para eliminar archivos pdb inmediatamente después de su creación, A MENOS que agregue /debug:pdbonly a la cadena CompilerOptions. Sin embargo, si lo hace, el indicador IncludeDebugInformation se ignora y el compilador genera un código optimizado que es difícil de depurar. Para evitar esto, debe indicar explícitamente al Generador de código que conserve todos los archivos.

Aquí está la receta completa:

parameters.GenerateInMemory = false; //default 
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true); 
parameters.IncludeDebugInformation = true; 
parameters.TempFiles.KeepFiles = true 

Aquí es la parte culpable del código de CSharpCodeGenerator:

string fileExtension = "pdb"; 
    if ((options.CompilerOptions != null) && (CultureInfo.InvariantCulture.CompareInfo.IndexOf(options.CompilerOptions, "/debug:pdbonly", CompareOptions.IgnoreCase) != -1)) 
    { 
     results.TempFiles.AddExtension(fileExtension, true); 
    } 
    else 
    { 
     results.TempFiles.AddExtension(fileExtension); 
    } 

El TempFiles.AddExtension(fileExtension, true) cuenta la compilación de mantener los archivos PDB. La opción else de results.TempFiles.AddExtension(fileExtension); le dice que trate pdb como todos los archivos temporales, lo que por defecto significa eliminarlos.

+0

El segundo argumento en 'TempFileCollection' (llamado" keepFiles ") ya establece la propiedad' KeepFiles' en verdadero. (o al menos lo hace en .NET 4.0) –

Cuestiones relacionadas