从c#调用ruby脚本

时间:2011-03-09 19:46:09

标签: c# .net ruby

这里回答calling a ruby script in c#

但这样做有用吗?我尝试了这个,但它一直失败“系统找不到指定的文件”错误,我假设它是因为文件名之前的ruby命令,但我不太确定。

感谢您的帮助

4 个答案:

答案 0 :(得分:4)

您也可以尝试使用IronRuby执行类似

的Ruby代码
using System;
using Microsoft.Scripting.Hosting;
using IronRuby;

class ExecuteRubyExample
{
    static void Main()
    {
        ScriptEngine engine = IronRuby.Ruby.CreateEngine();
        engine.ExecuteFile("C:/rubyscript.rb");
    }
}

答案 1 :(得分:1)

链接的答案看起来相当合适,但显然不适合你。这意味着它可能是两件事之一。

1)反斜杠咬你。尝试更改

ProcessStartInfo info = new ProcessStartInfo("ruby C:\rubyscript.rb");

ProcessStartInfo info = new ProcessStartInfo(@"ruby C:\rubyscript.rb");

ProcessStartInfo info = new ProcessStartInfo("ruby C:\\rubyscript.rb");

第一个更改使用字符串文字,第二个更改正确地转义反斜杠。

2)环境路径没有将Ruby的bin目录导出到它。这不太可能,更难以测试,所以我会专注于第一个。

答案 2 :(得分:0)

这是我运行红宝石脚本的代码。

using (var proc = new Process())
{
    var startInfo = new ProcessStartInfo(@"ruby");
    startInfo.Arguments = filePath;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    proc.StartInfo = startInfo;
    proc.Start();
}

此方法运行asynchronously,因为脚本可能花费未知的时间来运行,这允许main thread继续运行而不锁定它,然后等待脚本在返回Task之前完成运行。

private async Task RunRubyScript(string filePath)
{
  await Task.Run(() =>
  {
    using (var proc = new Process())
    {
      var startInfo = new ProcessStartInfo(@"ruby");
      startInfo.Arguments = filePath;
      startInfo.UseShellExecute = false;
      startInfo.CreateNoWindow = true;
      proc.StartInfo = startInfo;
      proc.Start();
      proc.WaitForExit();
    }
  });
}

希望这会有所帮助!

答案 3 :(得分:0)

试试这个

void runScript()
{
    using (Process p = new Process())
    {
        ProcessStartInfo info = new ProcessStartInfo("ruby");
        info.Arguments = "C:\rubyscript.rb args"; // set args
        info.RedirectStandardInput = true;
        info.RedirectStandardOutput = true;
        info.UseShellExecute = false;
        p.StartInfo = info;
        p.Start();
        string output = p.StandardOutput.ReadToEnd();
        // process output
    }
}