【问题标题】:Using a .net library from Java使用来自 Java 的 .net 库
【发布时间】:2014-08-30 03:55:45
【问题描述】:

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

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

有没有比生成文本格式的 .java 文件并使用 Java 编译器编译更好的解决方案? .java 文件只是通过某种 IPC 机制(可能是命名管道)与 .net dll 对话的轻量级接口,其目的是提供类似于从 .net 应用程序中看到的类型安全接口(除了索引器、获取器、设置器、重载等被某种可怕的冗长语法替换)。非常感谢。

【问题讨论】:

  • java原生接口?
  • 这大概也需要生成为文本,并且只会提供我不需要的功能以及能够破坏 VM 的额外好处?

标签: java .net


【解决方案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。

【讨论】:

  • 我没有看到 JNI 代码比 Java 更容易生成?我不能手动编写接口,它必须在 .net 中生成,因为它依赖于编译的 DSL。
  • 我不太确定您的要求。你在调用你一无所知的 auto-gen f# 代码?
  • 恰恰相反。我知道关于 dll 的一切,因为它是与它的 Java 包装器同时生成的。这就是为什么生成 Java 代码的等价的 Reflection.Emit 会有所帮助,以及为什么以文本格式生成 Java 然后用 javac 编译它会起作用。这样做感觉就像又回到了 90 年代初 :-)
  • @JoeHuha,也许有一个肮脏的正则表达式代码生成解决方案(你可以使用 Reflection.Emit 作为指南编写的东西)......因为你确实有来自 java 的那些线索,也许它不会世界上最糟糕的事情。我想c# -> java 可能有解决方案,我可能错了,但你不能把 f# 反编译成(可能不可读的)c# 吗?不过要注意,代码翻译有点棘手,而且没有一个工具有什么用处。
  • 我可以反编译 dll,虽然我已经知道代码是什么,因为我自己生成它。我认为不可能将任何最新版本的 C# 翻译成 Java,因为它有很多 Java 没有的特性。即使是泛型等基础知识也只能明智地走另一条路。听起来像是一个文本文件,后跟 javac 它是 :-( 非常感谢您的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多