.NET TIPS

Rubyスクリプト・ファイル内の関数をC#/VBプログラム内から呼び出すには?

デジタルアドバンテージ 一色 政彦
2012/08/10

 「TIPS:C#/VBプログラム内で外部のRubyスクリプト・ファイルを実行するには?」では、C#/VBプログラム内でRubyスクリプト・ファイル(以降、Rubyファイル)を実行する方法を紹介した。このときに、Rubyファイル内の特定の関数を、C#/VBプログラム内から呼び出したい場合があるだろう。本TIPSではこの方法を紹介する。

●Rubyファイル内の関数を呼び出す方法

 今回は前掲のTIPSで示したプログラムを改変して説明する。

 Rubyファイル内の関数をC#/VBプログラム内から呼び出すには、ScriptEngineオブジェクト(Microsoft.Scripting.Hosting名前空間)のOperationsプロパティから得られるObjectOperationsオブジェクト(Microsoft.Scripting.Hosting名前空間)の、InvokeMemberメソッドを使えばよい。InvokeMemberメソッドは次のようなシグネチャを持つ。

InvokeMember(object, string, params object[])
・第1パラメータ: ScriptScopeオブジェクト(Microsoft.Scripting.Hosting名前空間)を指定する。
・第2パラメータ: メンバ名(つまり関数名)を指定する。
・第3パラメータ以降: 関数への引数を指定する。
・戻り値: 関数が返却した値。動的型付け変数。

 次のコードは、前掲のTIPSで示したサンプル・プログラム(=Program.cs/Program.vbファイル)に、上記の内容(=太字部分)を追記したものである。

using System;
using IronRuby;
using Microsoft.Scripting.Hosting;

class Program
{
  static void Main(string[] args)
  {
    // Rubyスクリプト・エンジンの作成
    ScriptEngine engine = Ruby.CreateEngine();

    // Rubyスクリプト・ファイルを実行
    ScriptScope scope = engine.ExecuteFile("Hello.rb");

    // Rubyスクリプト・ファイル内の関数呼び出し
    var result =
      (string)engine.Operations.InvokeMember(
        scope, "hello_world", ".NET");

    // 出力結果例: "Hello .NET !!!"
    Console.WriteLine(result);

    // 出力結果が分かるように、実行を止める
    Console.ReadLine();   
  }
}
Imports IronRuby
Imports Microsoft.Scripting.Hosting

Module Module1

  Sub Main()

    ' Rubyスクリプト・エンジンの作成
    Dim engine As ScriptEngine = Ruby.CreateEngine()

    ' Rubyスクリプト・ファイルを実行
    Dim scope As ScriptScope = engine.ExecuteFile("Hello.rb")

    ' Rubyスクリプト・ファイル内の関数呼び出し
    Dim result = engine.Operations.InvokeMember( _
      scope, "hello_world", ".NET")

    ' 出力結果例: "Hello .NET !!!"
    Console.WriteLine(result)

    ' 出力結果が分かるように、実行を止める
    Console.ReadLine()

  End Sub

End Module
Rubyファイル内の関数を呼び出すコード(Program.cs/Program.vb)

 上記のコードから呼び出される、Rubyファイルの関数は次のようになっている。

# スクリプト・ファイル内の関数
def hello_world (message)
  "Hello #{message} !!!"
end
関数を含むRubyスクリプト(Hello.rb)

 このように、C#/VBプログラム内からRubyスクリプト・ファイル内の関数を呼び出すこともできる。この機能をうまく使えば、.NETプログラムを再ビルドすることなく、Rubyファイルを書き換えるだけで、一部の処理をカスタマイズすることなどが実現できるだろう。

 このほか、RubyファイルからC#/VBプログラム内のメソッドやプロパティを呼び出すこともできる。この方法については後日、別のTIPSで紹介する。End of Article

カテゴリ:開発環境&ツール 処理対象:Ruby
使用ライブラリ:Rubyクラス(IronRuby名前空間)
使用ライブラリ:ScriptEngineクラス(Microsoft.Scripting.Hosting名前空間)
使用ライブラリ:ObjectOperationsクラス(Microsoft.Scripting.Hosting名前空間)
使用ライブラリ:ScriptScopeクラス(Microsoft.Scripting.Hosting名前空間)

この記事と関連性の高い別の.NET TIPS
C#/VBプログラム内で外部のRubyスクリプト・ファイルを実行するには?
VB.NET固有の関数をC#で使用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間