likes
comments
collection
share

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库 ~背景 在公司项目中,我们常常遇到使用C#编

作者站长头像
站长
· 阅读数 84

背景

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

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

思路

众所周知:

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

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

环境

  • Net 7.0
  • C#
  • JAVA 8

步骤

1、C#

创建了一个简单的C#基础类库。这个类库是我们后续需要在JAVA中调用的目标。为了将这个C#代码编译成可供其他语言调用的动态链接库(DLL),我们需要将其编译并生成对应的DLL文件,这样其他语言才能够通过调用这个DLL来使用其中的功能。使用C#编译器将C#基础类库源代码编译成目标平台的DLL文件。编译完成后,我们得到了一个包含所需功能的动态链接库,该DLL文件可以被其他语言调用。一般情况下,编译器会将生成的DLL文件放置在项目的输出目录中,方便其他语言在相应的位置找到并引用。

创建一个C#的基本类库

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

项目命名为 TestClass

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

Net 7.0 创建

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

创建一个简单的静态类方法

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

namespace TestClass
{
    public class Hello
    {
        public static int add(int a, int b)
        {
            return  a + b;
        }
    }
}

设置项目属性 VisualStudio 鼠标放在项目上 Alt + Enter

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

编译,打包

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

DLL文件都在:

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

2、C++

创建了一个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#的功能。

创建 C++ 动态链接库DLL

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

命名 TestDll

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

创建好的项目

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

环境配置

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

代码编写

pch.h

#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

#include "pch.h"

#using "E:\\code\\C#\\TestClass\\TestClass\\bin\\Debug\\net7.0\\TestClass.dll"

using namespace TestClass;

int add(int a, int b) {
	return Hello::add(a, b);
}

编译打包

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

dll文件位置

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

3、JAVA 集成 JNI 调用。

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

引入jni

<jna.version>3.0.9</jna.version>

<!-- java 调用 dll 工具 jna -->
<dependency>
    <groupId>com.sun.jna</groupId>
    <artifactId>jna</artifactId>
    <version>${jna.version}</version>
</dependency>

创建接口

package com.yanxi.user.web.service;

import com.sun.jna.Library;
import com.sun.jna.Native;


public interface MyLibraryInterface extends Library {
    // 有两种办法,一种是将 TestDll.dll 加载进你java的path
    // 另一种是直接将 TestDll.dll 复制进你的path路径 博主将TestDll.dll直接复制到jar的bin目录下了。

    MyLibraryInterface instance = (MyLibraryInterface) Native.loadLibrary("TestDll", MyLibraryInterface.class);

    int AddFromCSharp(int a, int b);
}

java 调用

@SpringBootTest
class YxUserApplicationTests {


    @Test
    public void test(){
        int add = MyLibraryInterface.instance.AddFromCSharp(1, 2);
        System.out.println(add);
    }
}

成功

【.NET C# 学习之路】JAVA 调用 C# 动态库 DLL 函数库  ~背景 在公司项目中,我们常常遇到使用C#编

我哭死 ~ ,调试到半死....

总结

一定要多思考,如果人永远待在舒适圈的话,人永远不会成长。共勉

觉得作者写的不错的,值得你们借鉴的话,就请点一个免费的赞吧!这个对我来说真的很重要。૮(˶ᵔ ᵕ ᵔ˶)ა

转载自:https://juejin.cn/post/7304531203771367459
评论
请登录