我想在同一个进程中执行Java VM和C#应用程序,这样就可以为相同的共享库共享相同的内存区域和相同的内存。
有没有人知道这样做的方法?
我可以从Java运行Java或从C#运行C#,甚至可以使用C应用程序在同一进程中启动它们。
[更新]
http://jni4net.com/项目声称提供功能:“内部进程 - 这意味着两个虚拟机处于相同的进程中。任何调用都使用相同的线程和相同的堆栈用于两个环境。它相对较快。”
这正是我自己尝试做的,以便使用简单的堆外内存地址并将其用于两个进程内VM。
答案 0 :(得分:0)
C#是.NET编译成中间语言(IL),Java有可能是.NET IL的处理器,但是在构建时需要将其作为Java项目的一部分包含在内。 / p>
您将无法运行两个共享相同执行线程和内存的独立进程。
答案 1 :(得分:0)
底线是我认为这不是一个好主意。
根据我的个人经验,声称支持两者的所有当前可用项目都存在各种缺陷和库的支持问题甚至一些语言功能,甚至没有提及运行时性能。如果您不喜欢简单的套接字解决方案或内存映射文件,并声明它们是非标准的并且存在缺陷,那么我只能告诉您,您尝试使用的框架存在更多陷阱。
另外,共享内存的想法让我感到困惑。你想分享哪些确切的数据?请记住,C#和Java内存结构不是相互兼容的,您可以使用第三方标准存储一些内容,例如:音频/视频/图片等;或者您需要编写自己的序列化层,这实际上使您无法从两侧对同一对象进行操作。如果您已经在编写自己的序列化层,那么是什么阻止您使用套接字解决方案,这对我来说似乎是最好的支持?
如果存在任何性能问题,我可以说,由于您使用的是Java + C#解决方案,因此与应用程序可能实现的性能相比,MMF,套接字或共享内存之间的性能差异微不足道。如果您的应用程序确实需要这样的性能,那么最好用C ++甚至ANSI C来实现。
所以我完全赞同所有评论,你想要达到的目标似乎并没有朝着正确的方向发展。
答案 2 :(得分:0)
解决方案是将Java和Mono嵌入到同一个进程中。在C / C ++应用程序中有可用的资源,但它不限于C / C ++。
通过在同一个过程中嵌入Java和Mono(C#),可以保证所有需要的属性。共享内存中没有重复,内存操作是即时的,并且更改以正确的顺序显示。
应该注意在多个处理器设置中根据内存域固定线程一如既往,但就此而言。
甚至可以通过将C#和Java的线程固定到同一处理器来共享相同的处理器,并从第二级甚至第三级缓存中获利。
另一个重要的好处是,VM可以从共享同一个本地共享库实例中获益,从而导致代码在与同一个库实例交互的任一VM中运行,而不是使用两个不同的版本。
有用的信息:
答案 3 :(得分:0)
有一些方法可以在.NET进程中托管JVM,或者在Java进程中托管.NET CLR,但它们很丑陋,需要熟悉JNI(Java Native Interface)和/或CLR的基于COM的托管API。
幸运的是,互操作性工具封装了这些机制,允许Java和.NET在同一个进程中运行并自由地进行互操作。其中一个工具是JNBridge的JNBridgePro。有关更多信息,请访问www.jnbridge.com,特别是查找“共享内存”。
免责声明:我和JNBridge在一起。