我有一个特定于域的语言的编译器,它输出一个.net dll(然后可以用来做DSL应该做的任何事情)。它在.net下运行良好,但现在我需要使用Java可以访问已编译的dll功能。界面的变化取决于DSL,就像我实现F#类型的提供者一样。
理想情况下,我想要一些基于Reflection.Emit的东西,除了它会生成Java字节码。最终用户可以调试从Java GUI使用我生成的库的Java代码,这一点很重要,所以我不认为我可以使用IKVM在.net中包含Java代码。我也不能使用JNBridge这样的商业产品,因为所有用户都需要安装它,并在每次DSL代码更改时调用它。
有没有比以文本格式生成.java文件并使用Java编译器编译它更好的解决方案? .java文件只是一个轻量级接口,通过一些IPC机制(可能是命名管道)与.net dll通信,其目的是提供类似于从.net应用程序中看到的类型安全接口。 (除了索引器,getter,setter,重载等等,用某种可怕的冗长语法替换)。非常感谢。
答案 0 :(得分:1)
Java native interface是一种从Java调用本机代码的方法(该DLL不在JVM上运行,这是肯定的)。现在把你的梦想“写在垃圾桶里”。
如果你想使用dll,那么你必须使用JNI(或类似的东西或基于JNI的jni4net)。它不是那么令人愉快,使用来自c#的c ++,但是它非常可行而且远远超过了使用java中的dll的最佳方式(我认为第二好的是重写本机代码)。
或者你可以在你的java应用程序和soap / json / namedpipes / etc之间运行一个windows进程,这是你在最后一段建议的吗? 对于一个小型解决方案来说这是奇怪的,但对于一个更大的模块化项目来说,它并不是那么疯狂。我建议using sockets to communicate between the two,因为我认为套接字最容易。它在示例中说客户端/服务器,但它可能是两个进程(java和f#)。 ...这会导致性能,同步,防火墙等问题。啊,只需使用JNI。