2011-07-20 14 views
7

Así que sé para qué se usa Expression.DebugInfo, y tengo una expresión de depuración creada, pero ¿cómo etiqueto otras expresiones con esta información de depuración? Esto es lo que estoy tratando como una prueba muy básica:Expression.DebugInfo ¿Cómo puedo etiquetar expresiones?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Linq.Expressions; 
using System.Reflection; 

namespace ExpressionDebugTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("foo"), System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave); 

      var mod = asm.DefineDynamicModule("mymod", true); 
      var type = mod.DefineType("baz", TypeAttributes.Public); 
      var meth = type.DefineMethod("go", MethodAttributes.Public | MethodAttributes.Static); 

      var sdi = Expression.SymbolDocument("TestDebug.txt"); 

      var di = Expression.DebugInfo(sdi, 2, 2, 2, 12); 


      var exp = Expression.Divide(Expression.Constant(2), Expression.Subtract(Expression.Constant(4), Expression.Constant(4))); 
      var block = Expression.Block(di, exp); 

      Expression.Lambda(block, new ParameterExpression[0]).CompileToMethod(meth); 

      var newtype = type.CreateType(); 
      asm.Save("tmp.dll"); 
      newtype.GetMethod("go").Invoke(null, new object[0]); 
      //meth.Invoke(null, new object[0]); 
      //lambda.DynamicInvoke(new object[0]); 
      Console.WriteLine(" "); 
     } 
    } 
} 

sé Información de depuración sólo funciona para métodos compilados por eso que estoy generando un montaje sobre la marcha. Pero cuando este código causa un error "divide por cero", no muestra mi archivo "TestDebug.txt"

Respuesta

8

Parece que me faltaba el generador de información de depuración. Este código necesitaba ser agregado:

var gen = DebugInfoGenerator.CreatePdbGenerator(); 

    Expression.Lambda(block, new ParameterExpression[0]).CompileToMethod(meth,gen); 

¡Funciona como un encanto ahora!

Cuestiones relacionadas