如何在ASP.NET Core 3.1中调用Java代码,解决jni4net运行报错
解决方案
报错根因
你遇到的MissingMethodException是因为jni4net 0.8.8.0基于.NET Framework开发,依赖的System.AppDomain.DefineDynamicAssemblyAPI在.NET Core 2.1及更高版本中已被移除,因此无法直接在.NET Core 3.1环境下运行。
方案1:绕过当前报错
- 降级运行时到.NET Framework:将项目目标框架调整为.NET Framework 4.8,同时将项目改为基于.NET Framework的ASP.NET项目,即可直接复用你已验证过的jni4net桥接代码,改造成本最低。
- 替换适配.NET Core的jni4net分支:部分社区fork的jni4net版本已经适配了.NET Core的动态程序集生成接口,替换官方0.8.8.0版本的依赖包后即可正常调用,无需大幅修改现有代码。
方案2:替代Java调用方案
如果不想调整.NET版本,可以选择以下无需jni4net的互操作方案:
进程调用
将Java逻辑打包为可执行jar包,在ASP.NET Core中通过进程调用来执行,通过标准输入输出传递数据,适合调用频率低、逻辑简单的场景,示例代码如下:
using System.Diagnostics; public string CallJavaService(string param1, string param2) { var startInfo = new ProcessStartInfo { FileName = "java", Arguments = $"-jar your-java-package.jar {param1} {param2}", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; using var process = Process.Start(startInfo); string result = process.StandardOutput.ReadToEnd(); process.WaitForExit(); return result; }
HTTP服务封装
将Java代码封装为独立的HTTP接口,可使用轻量Java Web框架快速实现,ASP.NET Core通过HTTP请求调用该接口即可。该方案兼容性最好,支持跨平台部署、独立扩容,是生产环境的首选方案,仅需额外维护一个Java服务。
手动JNI封装
如果对性能要求极高,可以基于.NET Core支持的JNI接口手动写绑定代码,或者使用商用互操作库完成桥接,不过改造成本较高,适合对延迟要求非常严苛的场景。
内容的提问来源于stack exchange,提问作者Maik Hasler
相关产品推荐
相关产品推荐

