まず、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に渡す方法は?
ありがとうございました!