JAVA 调用 C# 动态库 DLL 函数库 ,研究了一天,头都大了

背景

在公司项目中,我们常常遇到使用C#编写的公共函数库,而我们的项目主要使用JAVA。如何在不直接调用C#的情况下使用这些功能呢?本文将介绍一种巧妙的方法,通过JAVA -> C++ -> C#的调用链,实现在JAVA项目中调用C#库的目标。

注意 : 本文作者也是初学者,仅供参考。

思路

众所周知:

  • JAVA 可以调取 C++ 的动态库。
  • C++ 可以调用 C# 的动态库。

因此,我们的思路是通过JAVA调用C++,再由C++调用C#,完成整个调用链的搭建。

步骤

1、创建 C# 基础类库。

创建了一个简单的C#基础类库。这个类库包含了一个名为Test1的类,其中定义了一个名为outSome的方法,该方法会输出"111"。这个类库是我们后续需要在JAVA中调用的目标。为了将这个C#代码编译成可供其他语言调用的动态链接库(DLL),我们需要将其编译并生成对应的DLL文件,这样其他语言才能够通过调用这个DLL来使用其中的功能。

c# 复制代码
namespace Test
{
    public class Test1
    {
        public void outSome(){
            Console.WriteLine("111");
        }
    }
}

2、编译C#基础类库

使用C#编译器将C#基础类库源代码编译成目标平台的DLL文件。编译完成后,我们得到了一个包含所需功能的动态链接库,该DLL文件可以被其他语言调用。一般情况下,编译器会将生成的DLL文件放置在项目的输出目录中,方便其他语言在相应的位置找到并引用。

解决方案生成DLL文件。

一般情况下DLL文件都在:

python 复制代码
..\项目\bin\Debug\net7.0

3、创建 C++ 动态链接库DLL

创建了一个C++的动态链接库(DLL)。这个DLL的主要作用是作为JAVA和C#之间的中间层,通过C++来实现两者之间的交互。在C++的代码中,我们引入了C#的DLL,使得C++可以调用其中的函数。这样,我们就实现了C++作为桥梁,连接JAVA和C#的目标。

使用C++编译器将C++动态链接库源代码编译成DLL文件。这个DLL文件包含了C++代码以及对C#基础类库的引用,成为JAVA调用C#的中间层。生成后的DLL文件需要和C#基础类库的DLL文件一同被其他语言引用,以确保JAVA可以通过C++间接调用C#的功能。

pch.h

c++ 复制代码
#ifndef PCH_H
#define PCH_H
 
#include "framework.h"
 
#define  MYLIBAPI  extern "C" __declspec(dllimport) 
 
MYLIBAPI int add(int a, int b);
 
#endif //PCH_H

pch.cpp

c++ 复制代码
#include "pch.h"
 
#using "D:\C#\Test\bin\Debug\Test.dll"
 
using namespace Test;
 
int add(int a, int b) {
	return Calculate::add(a,b);
}

生成

4、JAVA文件

通过JAVA文件调用了之前生成的C++动态链接库。在JAVA中,我们使用了JNA(Java Native Access)库来加载并调用C++的DLL文件。这个JAVA文件充当了JAVA和C++之间的桥梁,通过调用C++的DLL文件,实现了最终的目标:在JAVA中调用C#基础类库的功能。整个过程通过巧妙地使用不同语言的特性,实现了跨语言的功能调用链。

java 调用 C++库

java 复制代码
import com.sun.jna.Library;
 
public interface MyLibrary extends Library {
 
  int add3(int a, int b);
  
}

调用

java 复制代码
public class Main {

    static {
        System.loadLibrary("MyLibrary"); // 替换为实际的 JNI 库名
    }

    @Override
    public native int add(int a, int b);

    public static void main(String[] args) {
        Main main = new Main();
        int result = main.add(2, 3);
        System.out.println(result);
    }
}
相关推荐
郭庆汝7 分钟前
Windows安装java流程
java·windows·android studio
Yvonne爱编码12 分钟前
后端编程开发路径:从入门到精通的系统性探索
java·前端·后端·python·sql·go
迦蓝叶27 分钟前
JAiRouter 0.8.0 发布:Docker 全自动化交付 + 多架构镜像,一键上线不是梦
java·人工智能·网关·docker·ai·架构·自动化
lljss202032 分钟前
C# 每个chartArea显示最小值、平均值、最大值
开发语言·c#
im_AMBER1 小时前
Leetcode 18 java
java·算法·leetcode
Android技术之家1 小时前
Kotlin与Compose:Android开发的现代化变革
android·java·开发语言·kotlin
失散131 小时前
分布式专题——10.3 ShardingSphere实现原理以及内核解析
java·分布式·架构·shardingsphere·分库分表
十八旬1 小时前
【超简单】后端入门案例-基于SpringBoot+MyBatis-plus+MySQL图书管理系统
java·开发语言·idea·intellij idea·项目实战
wearegogog1231 小时前
C#与Twincat 2 实现上位机控制软PLC功能
开发语言·c#
zhz52141 小时前
Spring Boot + Redis 缓存性能优化实战:从5秒到毫秒级的性能提升
java·spring boot·redis·缓存·vue