2011-07-20 22 views
7

Expression.DebugInfoがどのようなもので使用されているのか知っていますし、デバッグ式を作成しましたが、他の式にこのデバッグ情報をタグ付けする方法はありますか?ここで私は本当に基本的なテストとして、しようとしているものです:Expression.DebugInfo式にタグを付けるにはどうすればよいですか?

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(" "); 
     } 
    } 
} 

私はその場でアセンブリを生成しています理由ですので、デバッグ情報のみがコンパイルされたメソッドのために働く知っています。しかし、このコードで "ゼロ除算"エラーが発生すると、私の "TestDebug.txt"ファイルが表示されない

答えて

8

デバッグ情報ジェネレータが不足しているようです。このコードを追加する必要がありました:

var gen = DebugInfoGenerator.CreatePdbGenerator(); 

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

これは今の魅力のように機能します!

関連する問題