Windows Dev. Site

calling Clojure from C#

.NETフレームワークがオープンソースになるということですが、C#のプログラムがJavaのようにクロスプラットホームで使われるようになるかもしれません。
Javaの資産は膨大なものがありますので、これをC#から呼び出す方法を試してみようと今回思いました。以前、JNIを使ってC++/CLIからJava(http://crossframe.iiv.jp/2013021475/)を呼び出すテストをしたことがありますが、これはちょっと面倒なので、もっと簡単な方法はないかと調べたら、いいのがありました。

http://jni4net.com/

bridge between Java and .NET (intraprocess, fast, object oriented, open-source)

Java と.NET相互に呼び出しが簡単にできそうです。今回は.NETからJava呼び出しのみテスト。
しかしあまりあっけなくできてしまったので、もう少し踏み込んで、Clojureの呼び出しをしてみました。
JavaからClojureの呼び出しは、こちら(http://bitlife.me/archives/297)でテストした、プログラムを使い、このJavaプログラム部分を変更して、C#から呼び出します。

環境 : jni4net 0.8.8, Java 1.8.0_25, Visual Studio 2013 Update3 / Windows 8.1
JavaMainCs.java

import clojuresub.core;

public class JavaMainCs{
	public static void sub(String str){
		core.sub(str);
	}
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using net.sf.jni4net;

namespace CSharpMain
{
    class Program
    {
        static void Main(string[] args)
        {
            var bs = new BridgeSetup();

            bs.AddClassPath(@"C:\wk\", true);
            bs.AddAllJarsClassPath(@"C:\wk\");

            Bridge.CreateJVM(bs);

            java.lang.Class jclass = 
                java.lang.ClassLoader.getSystemClassLoader().loadClass("JavaMainCs");

            java.lang.Class[] cls = { java.lang.String._class };
            java.lang.Object[] obj = { new java.lang.String("C# String") };

            java.lang.reflect.Method method = jclass.getMethod("sub", cls);
            method.invoke(null, obj);

            Console.ReadKey();
        }
    }
}

C#のコードの中にJavaが書けてしまい、ちょっと不思議な感覚になります。

VisualStudioでは参照追加とビルド設定をします。
clojure_cs01

以下のようにファイルを配置して実行しました。(JavaMain.classは前のテストのものなので不要)
clojure_cs02

最近、Lispを再勉強中ということもあって、Java環境ではClojureを使っていましたが、この記事を書きながらいろいろと調べていたら、WindowsにはIronSchemeというものがあることを知りました。次回、これをとりあげてみたいと思います。