我有一些 Java 应用程序和一些使用 C# 实现的 UWP 应用程序的客户,这些应用程序通过 Windows 应用商店等分发,他们想要使用我的应用程序的某些部分。这些部分非常独立于操作系统,只解析一些特殊的二进制文件格式,应用一些使用 YAML 文件和东西配置的业务逻辑。没有网络,GUI,只有一些文件访问等
我们目前使用 IKVM 使感兴趣的代码可用于 C#,但已经遇到了不同的问题。有些支持.NET Core,有些与Release中的nativetoolchain等有关。虽然在应用一些变通方法后现在一切似乎都有效,但我已经在寻找IKVM的替代品了.
我目前使用 IKVM 的唯一一件事就是使用 ikvmc 创建我的代码的 DLL,然后可以在 UWP 项目中引用它。编译器总结如下:
ikvmc 工具将 Java 字节码转换为 .NET dll 和 exe。
这就是我想到支持创建 GraalVM 的本机 Windows 映像的地方。其他人似乎已经为 Windows 构建了本机二进制文件,根据文档,GraalVM 能够使用“--shared”创建共享库。根据我的理解,IKVM 在 .NET 中实现了一个 JVM,并根据需要和可能映射事物。这听起来很像“Substrate VM”在处理原生图像时所做的,不是吗?
这个可执行文件包括应用程序、库、JDK 和 不在 Java VM 上运行,但包含必要的组件,例如 来自不同虚拟机的内存管理和线程调度 机器,称为“Substrate VM”。 Substrate VM 是 运行时组件(如反优化器、垃圾收集器、线程 日程安排等)。
https://www.graalvm.org/docs/reference-manual/native-image/
那么,是否有可能以 DLL 形式的本机映像替代目前由
ikvmc
创建的 DLL?有没有人已经尝试过并且有任何经验?有没有人已经尝试创建一个本机 DLL 并在其他一些本机 Windows 应用程序中使用它?根据我的理解,UWP“仅”应用了可能能够再次解决的额外限制。或者由于某些原因这种方法是完全不可能的?
感谢大家的参与!
我对IKVM项目不是很熟悉,所以这个回答主要是关于通用问题:
你能创建一个本机 DLL/共享库并在其他一些本机 Windows 应用程序中使用它吗?
应该可以。您可以将 Java 代码编译成共享库。入口点标有
@CEntrypoint
注释。
然后您可以使用生成的共享库和头文件从本机应用程序使用您的库。
例如 GraalVM 发行版默认使用 GraalVM JIT 编译器:
这里有一个页面描述了如何通过 JNI 使用 Java 中的那些:https://web.archive.org/web/20211212131233/https://www.graalvm.org/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/
这可能与您如何从 C# 应用程序使用共享库非常相似。
GraalVM 原生图像不是很灵活,不像 IKVM.NET 图像。除非你喜欢编写包装器和玩 P/Invoke,否则你应该坚持使用 IKVM.NET。
注意:我支持 IKVM.NET 分支