我正在使用Roslyn脚本编写(使用Microsoft.CodeAnalysis.CSharp.Scripting
nuget包),我想知道是否有一种方法可以将行号信息添加到脚本内发生异常的堆栈跟踪中。
当我运行以下C#代码时:
// using Microsoft.CodeAnalysis.CSharp.Scripting;
var code = @"
var a = 0;
var b = 1 / a;
";
try
{
await CSharpScript.RunAsync(code);
}
catch (DivideByZeroException dbze)
{
Console.WriteLine(dbze.StackTrace);
}
在控制台中输出的堆栈跟踪信息如下:
at Submission#0.<<Initialize>>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.CodeAnalysis.Scripting.ScriptExecutionState.<RunSubmissionsAsync>d__9`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.CodeAnalysis.Scripting.Script`1.<RunSubmissionsAsync>d__21.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at UnitTests.ExploreRoslyn.<ScriptWithRuntimeError>d__4.MoveNext() in D:\dev\misc\netmockery\UnitTests\ExploreRoslyn.cs:line 47
请注意,如果我尝试在脚本内捕获异常,结果是类似的:
var code = @"
try {
var a = 0;
var b = 1 / a;
}
catch (System.DivideByZeroException dbze)
{
Console.WriteLine(dbze.StackTrace);
}
";
await CSharpScript.RunAsync(code);
这将输出:
at Submission#0.<<Initialize>>d__0.MoveNext()
如何让Roslyn脚本引擎在编译/执行脚本时添加调试信息,以便在堆栈跟踪中获取行号信息?请输出到控制台。
compilation.GetEntryPoint()
来获取工厂方法符号。然后,您可以使用entryPoint.ContainingType.MetadataName
获取提交的类名,使用entryPoint.Name
获取工厂方法的名称。这样会感觉不那么像黑客攻击 :-) - Sebastien Pellizzaricompilation.GetEntryPoint()
需要一个 _取消标记_,因此只需将CancellationToken.None
传递给该方法即可... - Pierre Arnaud