C# 如何为IronRuby使用ErrorListener

C# 如何为IronRuby使用ErrorListener,c#,ironruby,C#,Ironruby,我有一个C#程序来执行IronRuby脚本。但在此之前,我想先编译文件,看看是否有任何错误。但是,似乎ErrorListener工作得不好。我的代码有什么问题吗 class Program { static void Main(string[] args) { try { ScriptEngine engine = null; engine = Ruby.CreateEngine();

我有一个C#程序来执行IronRuby脚本。但在此之前,我想先编译文件,看看是否有任何错误。但是,似乎ErrorListener工作得不好。我的代码有什么问题吗

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ScriptEngine engine = null;
            engine = Ruby.CreateEngine();

            ScriptSource sc = engine.CreateScriptSourceFromFile("MainForm.rb");
            ErrorListener errLis = new MyErrorListener();
            sc.Compile(errLis);
    }
}

class MyErrorListener : ErrorListener
{
    public override void ErrorReported(ScriptSource source, string message, Microsoft.Scripting.SourceSpan span, int errorCode, Microsoft.Scripting.Severity severity)
    {
        Console.WriteLine(message);
    }
}
Ruby文件:

require "mscorlib"
require "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
require "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

include System::Windows::Forms
dfasdf error here
class MainForm < Form
def initialize()
    self.InitializeComponent()
end

def InitializeComponent()
    # 
    # MainForm
    # 
    self.Name = "MainForm"
    self.Text = "HelloRubyWin"
end
end
需要“mscorlib”
要求“System.Windows.Forms,版本=2.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089”
要求“System.Drawing,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”
包括系统::Windows::窗体
这里是dfasdf错误
类MainForm
您试图做的事情似乎实际不起作用。不过,我不确定这是不是一个bug

要解决这个问题,只需在try/catch块中执行代码并查找MissingMethodExecption。请注意,如果语法错误在方法内部,这也不会有帮助,因为IronRuby(或任何其他动态语言)在实际执行“嵌套”代码之前不会对其执行任何操作

所以一般来说,我认为你不会从你所做的事情中获得很多价值

try/catch代码示例:

ScriptEngine engine = null;
engine = Ruby.CreateEngine(x => { x.ExceptionDetail = true; });         

ScriptSource sc = engine.CreateScriptSourceFromFile("MainForm.rb");
ErrorListener errLis = new MyErrorListener();
sc.Compile(errLis);

try
{
    dynamic d = sc.Execute();
}
catch (MissingMethodException e)
{
    Console.WriteLine("Syntax error!");
}

我对这个问题进行了研究,最终找到了解决方案,即首先在下面的管理器中编写ErrorListener类

public class IronRubyErrors : ErrorListener
{
    public string Message { get; set; }
    public int ErrorCode { get; set; }
    public Severity sev { get; set; }
    public SourceSpan Span { get; set; }
    public override void ErrorReported(ScriptSource source, string message, Microsoft.Scripting.SourceSpan span, int errorCode, Microsoft.Scripting.Severity severity)
    {
        Message = message;
        ErrorCode = errorCode;
        sev = severity;
        Span = span;
    }
}
然后

由于Ironruby是DLR,因此它在运行时编译Ironruby关键字以外的字符,如(~、`、^等)或者您已经创建了任何语法错误,然后将在ScriptSource的Compile方法上捕获错误,并填充ErrorListener类的对象,我们将找到ErrorCode等。如果您使用了Ruby库中未定义的方法,例如,您键入了用于数字转换的方法,如下所示

    @abc.to_
如果不正确,则将在MissingMethodException块中捕获它

正确的方法是

    @abc.to_f

如果您得到的错误不是这些(比如除以零异常),那么它将被捕获到异常块中

对于我来说,IronRuby 1.13(NuGet上的最新版本)似乎不起作用。
MyErrorListener.ErrorReported
函数从未启动。您解决过这个问题吗?
    @abc.to_f