首先,这是我在 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 环境的另一个文件夹中。
当我运行其他环境时,程序崩溃并产生此错误:“ArgumentError发生。未定义的类/模块系统::”
我又做了一些测试,我意识到当我将上面的代码更改为此时(参见带有三重“*”的行:
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?
谢谢!