IronRuby,如何将参数变量从 C# 传递到 Ruby



首先,这是我在SharpDevelop项目的bin/debug文件夹中设置的Ruby文件的代码:

class Run_Marshal
    def initialize(id, name)
        @list = []
        @list[0] = Employee_Info.new(id, name)
        File.open("employee_sheet.es", "wb") {|f| Marshal::dump(@list, f)}
    end

end
class Employee_Info
    attr_accessor :id
    attr_accessor :name
    def initialize(id, name)
        @id = id
        @name = name
    end
end

上面的代码允许将Employee_Info对象序列化为文件。让我们注意我已经安装了IronRuby。

下面是我用来执行 ruby 代码的 C# 代码。将参数从 C# 传递到我的新 Ruby 对象非常重要。

void Btn_exportClick(object sender, EventArgs e)
{
            var engine = Ruby.CreateEngine();
            engine.ExecuteFile("Ruby_Classes.rb");
            dynamic ruby = engine.Runtime.Globals;
            int id = 0;
            string name = "John Coles";
            dynamic foo = ruby.Run_Marshal.@new(id, name);
}

最后,这是在另一个不同的 ruby 环境中设置的另一个 ruby 项目的 ruby 代码。

@my_foo = File.open("Data/employee_sheet.es", "rb") {|f| Marshal.load(f)}
@name = @my_foo[0].name

当然,我也确保在其他环境中提供Employee_Info类。

class Employee_Info
    attr_accessor :id
    attr_accessor :name
    def initialize(id, name)
        @id = id
        @name = name
    end
end

代码从我的 SharpDevelop 项目中完美运行,并在 bin/debug 文件夹中输出一个序列化(元帅)文件。然后,我获取该序列化文件并将其放入另一个 ruby 环境的另一个文件夹中。

当我运行其他环境时,程序崩溃并产生此错误:"发生了参数错误。未定义的类/模块系统:"

做了更多的测试,我意识到当我将上面的代码更改为这个时(请参阅带有三重"*"的行:

class Run_Marshal
    def initialize(id, name)
        @list = []
        @list[0] = Employee_Info.new(0, "Beettlejuice") // ***
        File.open("employee_sheet.es", "wb") {|f| Marshal::dump(@list, f)}
    end

end

它现在打开序列化文件没有任何问题。所以我怀疑问题是由于从 C# 代码传递到 ruby 代码的参数造成的。我确实需要为更复杂的任务传递 c# 变量,但到目前为止,我不知道如何使其工作。我希望你们能解释一下出了什么问题。那么如何将参数变量从 C# 传递给 Ruby呢?

谢谢!

我无法解释如何以及为什么,但我以这种方式解决了问题:

class Run_Marshal
    def initialize(id, name)
        @list = []
        @list[0] = Employee_Info.new(id, name.to_s)
        File.open("employee_sheet.es", "wb") {|f| Marshal::dump(@list, f)}
    end
end

我向传递的字符串添加了to_s。显然,Ruby 没有将参数识别为字符串。

相关内容

  • 没有找到相关文章