C# CSharpScript.EvaluateAsync中的异常行号

C# CSharpScript.EvaluateAsync中的异常行号,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我正在使用CSharpScript.evaluationAsync方法评估脚本,并传递一些C代码。 当出现解析问题(例如语法错误)时,我可以很容易地看到错误的行号,但当出现运行时异常时,我得到的只是一个aggregateeexception包装我的异常(NullReferenceException),但没有关于如何获取行号的线索(在下面的示例中为3) Console.WriteLine(CSharpScript.evaluatesync( @“字符串s=null; //第2行的一些评论 var

我正在使用
CSharpScript.evaluationAsync
方法评估脚本,并传递一些C代码。 当出现解析问题(例如语法错误)时,我可以很容易地看到错误的行号,但当出现运行时异常时,我得到的只是一个
aggregateeexception
包装我的异常(
NullReferenceException
),但没有关于如何获取行号的线索(在下面的示例中为3)

Console.WriteLine(CSharpScript.evaluatesync(
@“字符串s=null;
//第2行的一些评论
var upper=s.ToUpper();//第3行出现空引用异常
//更多代码“)。结果);
编辑:


我一直在研究这个问题,发现脚本API创建了一个没有pdb信息的程序集,因此不可能知道异常发生在哪里。我说的对吗?

在这种情况下,您可能需要查看
AggregateException.InnerExceptions
属性中的信息。

在CSharpScript的某些版本中,团队添加了一个解决方案:现在您可以添加
ScriptOptions.Default.WithEmitDebugInformation(true)
evaluateSync
方法

关于如何提取异常行号,请参见下面的测试用例:

[TestMethod]
public void LineNumberInStackTrace()
{
    try
    {
        var result = CSharpScript.EvaluateAsync<int>(
            @"string s = null; 
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code", ScriptOptions.Default.WithEmitDebugInformation(true)).Result;

    }
    catch (AggregateException e)
    {
        if (e.InnerException is NullReferenceException inner)
        {
            var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal) + 6;
            var lineNumberStr = inner.StackTrace.Substring(
                startIndex, inner.StackTrace.IndexOf("\r", StringComparison.Ordinal) - startIndex);
            var lineNumber = Int32.Parse(lineNumberStr);

            Assert.AreEqual(3, lineNumber);
            return;
        }
    }
    Assert.Fail();
}
[TestMethod]
public void LineNumberNotInStackTrace()
{
    try
    {
        var result = CSharpScript.EvaluateAsync<int>(
            @"string s = null; 
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code").Result;

    }
    catch (AggregateException e)
    {
        if (e.InnerException is NullReferenceException inner)
        {
            var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal);

            Assert.AreEqual(-1, startIndex);
            return;
        }
    }
    Assert.Fail();
}
[TestMethod]
public void linenumbersTackTrace()
{
尝试
{
var result=CSharpScript.EvaluateAsync(
@“字符串s=null;
//第2行的一些评论
var upper=s.ToUpper();//第3行出现空引用异常
//更多代码”,ScriptOptions.Default.WithEmitDebugInformation(true)).Result;
}
捕获(聚合异常e)
{
if(e.InnerException为NullReferenceException内部)
{
var startIndex=internal.StackTrace.IndexOf(“:line”,StringComparison.Ordinal)+6;
var lineNumberStr=inner.StackTrace.Substring(
startIndex,inner.StackTrace.IndexOf(“\r”,StringComparison.Ordinal)-startIndex);
var lineNumber=Int32.Parse(lineNumberStr);
Assert.AreEqual(3,行号);
返回;
}
}
Assert.Fail();
}
[测试方法]
public void LineNumberNotInStackTrace()
{
尝试
{
var result=CSharpScript.EvaluateAsync(
@“字符串s=null;
//第2行的一些评论
var upper=s.ToUpper();//第3行出现空引用异常
//更多代码“)。结果;
}
捕获(聚合异常e)
{
if(e.InnerException为NullReferenceException内部)
{
var startIndex=internal.StackTrace.IndexOf(“:line”,StringComparison.Ordinal);
Assert.AreEqual(-1,startIndex);
返回;
}
}
Assert.Fail();
}

我在
NullReferenceException
这是
InnerException
中没有看到任何行号信息。没有改变任何事情,所以我建议你把这个问题提交给Roslyn回购协议。
[TestMethod]
public void LineNumberInStackTrace()
{
    try
    {
        var result = CSharpScript.EvaluateAsync<int>(
            @"string s = null; 
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code", ScriptOptions.Default.WithEmitDebugInformation(true)).Result;

    }
    catch (AggregateException e)
    {
        if (e.InnerException is NullReferenceException inner)
        {
            var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal) + 6;
            var lineNumberStr = inner.StackTrace.Substring(
                startIndex, inner.StackTrace.IndexOf("\r", StringComparison.Ordinal) - startIndex);
            var lineNumber = Int32.Parse(lineNumberStr);

            Assert.AreEqual(3, lineNumber);
            return;
        }
    }
    Assert.Fail();
}
[TestMethod]
public void LineNumberNotInStackTrace()
{
    try
    {
        var result = CSharpScript.EvaluateAsync<int>(
            @"string s = null; 
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code").Result;

    }
    catch (AggregateException e)
    {
        if (e.InnerException is NullReferenceException inner)
        {
            var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal);

            Assert.AreEqual(-1, startIndex);
            return;
        }
    }
    Assert.Fail();
}