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

时间:2013-01-27 21:03:33

标签: c# ruby argument-passing ironruby

首先,这是我在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文件夹中输出一个序列化(marshal)文件。然后,我将该序列化文件放入另一个ruby环境的另一个文件夹中。

当我运行其他环境时,程序崩溃并产生此错误:“ArgumentError出现。未定义的类/模块System ::”

我做了一些测试,我意识到当我将上面的代码更改为此时(请参阅三元组'*':

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?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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没有将参数识别为字符串。