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が書けてしまい、ちょっと不思議な感覚になります。
以下のようにファイルを配置して実行しました。(JavaMain.classは前のテストのものなので不要)
最近、Lispを再勉強中ということもあって、Java環境ではClojureを使っていましたが、この記事を書きながらいろいろと調べていたら、WindowsにはIronSchemeというものがあることを知りました。次回、これをとりあげてみたいと思います。