2

まず、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に渡す方法は?

ありがとうございました!

4

1 に答える 1

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 は引数を文字列として認識していませんでした。

于 2013-01-29T17:08:11.527 に答える