首先,我已经阅读了使CLR/.NET语言可调试,但我仍然无法实现这一点.
我编写了一种玩具语言,通过生成Linq表达式,然后调用LambdaExpression#CompileToMethod.大多数这些表达式都附带调试信息,如下所示:
//SmithExpression#InsertDebugInfo
Expression InsertDebugInfo(Expression expression, DebugInfo debugInfo) {
var column = 1;
var debugExpr = Expression.DebugInfo(debugInfo.SymbolDocumentInfo
,Info.LineNumber, column, Info.LineNumber, column + 1);
return Expression.Block(debugExpr, expression);
}
Run Code Online (Sandbox Code Playgroud)
DebugInfo如下所示:
public class DebugInfo {
/* arbitrary value from http://www.famkruithof.net/uuid/uuidgen */
public static Guid SmithGuid = new Guid("83c65910-8376-11e2-9e96-0800200c9a66");
public readonly SymbolDocumentInfo SymbolDocumentInfo;
public readonly DebugInfoGenerator DebugPdbGenerator;
public DebugInfo(String name) {
SymbolDocumentInfo = Expression.SymbolDocument(name, SmithGuid);
DebugPdbGenerator = DebugInfoGenerator.CreatePdbGenerator();
}
}
Run Code Online (Sandbox Code Playgroud)
整个事情都是这样的(你可以忽略关于inits的部分):
public static Action CompileSmithExpression(SmithExpression sexpression
,DebugInfo debugInfo, Parameter moduleParameter, Expando module) …Run Code Online (Sandbox Code Playgroud)