我有一个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

最佳答案

您尝试做的事情似乎实际上没有用。不过,不确定是否是错误。

要解决此问题,只需在try / catch块中执行代码,然后寻找MissingMethodExecption。请注意,如果语法错误在方法内部,这也将无济于事,因为IronRuby(或任何其他动态语言)在“嵌套”代码真正执行之前不会对其执行任何操作。

因此,总的来说,我认为您不会从尝试中获得很多价值。

尝试/捕获代码示例:

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

关于c# - 如何为IronRuby使用ErrorListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9324536/

10-09 12:37