使用Java中的.net库

使用Java中的.net库,java,.net,Java,.net,我有一个针对特定领域语言的编译器,它输出一个.NETDLL(然后可以用它来做DSL所说的任何事情)。它在.net下运行良好,但现在我需要使编译后的dll功能可以从Java访问。接口会根据DSL的不同而变化,就像我在实现F#type提供程序时一样 理想情况下,我想要一些与Reflection.Emit类似的东西,只是它会生成Java字节码。最终用户可以调试使用我从Java GUI生成的库的Java代码,这一点很重要,因此我不认为我可以使用IKVM将Java代码包含在.net中。我也不能使用像JNB

我有一个针对特定领域语言的编译器,它输出一个.NETDLL(然后可以用它来做DSL所说的任何事情)。它在.net下运行良好,但现在我需要使编译后的dll功能可以从Java访问。接口会根据DSL的不同而变化,就像我在实现F#type提供程序时一样

理想情况下,我想要一些与Reflection.Emit类似的东西,只是它会生成Java字节码。最终用户可以调试使用我从Java GUI生成的库的Java代码,这一点很重要,因此我不认为我可以使用IKVM将Java代码包含在.net中。我也不能使用像JNBridge这样的商业产品,因为所有用户都需要安装它,并在每次DSL代码更改时调用它

有比生成文本格式的.java文件并用java编译器编译更好的解决方案吗?java文件只是一个轻量级接口,通过某种IPC机制(可能是命名管道)与.net dll进行通信,其目的是提供一个类型安全接口,类似于从.net应用程序中看到的接口(除了索引器、getter、setter、重载等被某种极其冗长的语法所取代)。非常感谢。

是一种从Java调用本机代码的方法(该dll肯定没有在JVM上运行)。现在就把你的梦想“写一次,到处跑”扔进垃圾桶

如果您想使用DLL,那么您必须使用(或类似的或基于类似JNI的东西)。它不像C.C++那样使用C++,这是非常可取的,也是从java中使用DLL的最好方法(我认为第二个最好的方法是重新编写本机代码)。 或者,您可以在java应用程序旁边运行windows进程,并在两者之间运行soap/json/namedpipes/etc,这是您在最后一段中的建议吗?
这对于一个小的解决方案来说是很奇怪的,但是对于一个更大的模块化项目来说,这并不是那么疯狂。我会推荐,因为我认为插座是最简单的。在示例中,它表示客户机/服务器,但它可能是两个进程(java和f#)。。。这会导致性能、同步、防火墙等方面的问题。。啊,只要使用JNI。

java本机接口?这可能也需要以文本的形式生成,并且只提供我不需要的功能,还可以破坏VM?我看不出JNI代码比java更容易生成?我不能手工编写接口,它必须在.net中生成,因为它取决于编译它的DSL。我不太确定您的要求。你打电话给你一无所知的自动生成代码?恰恰相反。我知道关于dll的一切,因为它与Java包装器同时生成。这就是为什么产生Java代码的Reflection.Emit的等价物会有所帮助,以及为什么以文本格式生成Java然后用javac编译它会起作用。这样做感觉又回到了90年代早期:-)@JoeHuha,也许有一个肮脏的regex代码gen解决方案(你可以使用Reflection.Emit作为指南来编写)。。。既然你确实从java中得到了这些线索,也许这不会是世界上最糟糕的事情。我想可能有解决方案,我可能是错的,但你不能把f反编译成(可能是不可读的)c吗?不过要注意,代码翻译有点棘手,没有一个工具是好的。我可以反编译dll,尽管我已经知道代码是什么,因为我自己生成它。我认为不可能将任何最新版本的C#翻译成Java,因为它有很多Java没有的特性。即使是泛型这样的基础知识也只能明智地走另一条路。听起来像是一个文本文件,后面跟着javac,它是:-(非常感谢您的时间。