Windows Dev. Site

C#, Lua連携

Luaという汎用スクリプト言語ですが、最近いろんなところで目にするようになりました。ネットワークツールのNmap、インメモリDBのRedis、Vocaloidやゲームなど、幅広いところで使われています。VisualStudioのNuGetにもSharpLuaというパッケージがあったので、これを使ってC#との相互呼び出しをやってみようと思いました。
しかし、C#からはLuaを使えるのですが、その逆がうまくいかなかったので、LuaInterface(http://code.google.com/p/luainterface/)というものを使いました。

環境 : VisualStudio 2010 / Windows 7
C#コンソールアプリケーション


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LuaInterface;
using System.Reflection;

namespace csConsLua
{
    class Program
    {
        LuaInterface.Lua lua = new LuaInterface.Lua();

        static void Main(string[] args)
        {
            Program p = new Program();

            p.start();

            Console.ReadLine();
        }
        public void csFunc(string msg)
        {
            Console.WriteLine("msg : " + msg);
        }
        public void start()
        {
            lua.DoString("function luaFunc(msg) return string.format(\"msg : %s\", msg) end");

            object[] o = this.lua.GetFunction("luaFunc").Call("from C#");
            string s = (string)o[0];

            Console.WriteLine(s);
            
            lua.RegisterFunction("csFunc", this, GetType().GetMethod("csFunc"));

            lua.DoString("csFunc(\"from Lua\")");

        }
    }
}

設定としては、http://luainterface.googlecode.com/files/LuaInterface_2.0.3.7z を解凍してできたdllを、「参照の追加」で読み込み、プロジェクトのプロパティで、「対象のフレームワーク」を ‘.Net Framework 3.5 Client Profile’ にしました。
これを実行した出力は、

msg : from C#
msg : from Lua

となります。
また、統合開発環境には、ZeroBraneStudio(https://github.com/pkulchenko/ZeroBraneStudio)というものがあり、学習に便利だと思いました。

次は、Redis/Azureあたりをやってみたいと思っています。