schwarzの雑記 このページをアンテナに追加 RSSフィード

06/10/19 (Thu)10月19日の雑記

[] 10月19日の雑記 - schwarzの雑記 を含むブックマーク

C#からRubyを呼ぶ方法をいろいろと考えておりました。なかなか、難しいです。

以下備忘録。


まずひとつは、msvcrt-ruby18.dllを使う方法。

using System;
using System.Runtime.InteropServices;

class RubyCall_Dll {

    [DllImport("msvcrt-ruby18.dll")]
    extern static void ruby_init();
    [DllImport("msvcrt-ruby18.dll")]
    extern static void rb_eval_string(string str);

    static void Main(string[] args) {

        string program = @"
            open('test.txt', 'w'){ |io|
                io.print('hogehoge')
            }
        ";

        ruby_init();
        rb_eval_string(program);
            
    }
}

残念ながらpすらできません。それでもってdllの関数が良くわからんです。

(これのDllImportのところを"RGSS102J.dll"に変えてごにょごにょとハックするとRGSSの裏が垣間見れて結構面白かったですが規約違反ぽいのでこれ以上は言えません。)



もう一つの方法は、コマンドプロンプトでrubyコマンドを呼び出す要領でやるもので、ちょっと長いけどこっちの方がよさそうです。

using System;
using System.Diagnostics ;

class RubyCall_Process {

    static void Main(string[] args) {

        string program = @"
            def foo
              return 'hogehoge'
            end
            p foo
        ";

        Process process = new Process() ;
        process.StartInfo.FileName = 
Environment.GetEnvironmentVariable("ComSpec");
        process.StartInfo.Arguments = @"/C ruby -e '" + 
program.Replace("\n", ";").Replace("\'", "\\'") + "'";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardInput = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.Start();

        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
        process.WaitForExit();
        Console.WriteLine(output + error);
        Console.ReadLine();
      
    }
}                 

どっちにしろ、Rubyが予めインストールされていることが必要です。