当前位置: 代码网 > it编程>编程语言>Java > Java调用C#动态库的三种方法详解

Java调用C#动态库的三种方法详解

2025年06月08日 Java 我要评论
方法1:c++/cli搭建桥梁——java ↔ c# 的“翻译官”“c++/cli是‘双语老师’,java

方法1:c++/cli搭建桥梁——java ↔ c# 的“翻译官”

“c++/cli是‘双语老师’,java通过它调用c#!代码详解看这里!”

步骤1:创建c#类库(.net dll)

// csharplibrary.cs
using system;

namespace csharplibrary {
    public class calculator {
        public int add(int a, int b) {
            return a + b;
        }
    }
}

编译为dll

  • 用visual studio创建类库项目,输出文件为 csharplibrary.dll

步骤2:用c++/cli创建包装器

“c++/cli是‘翻译官’,把c#的‘中文’翻译成c++的‘英文’!”

// cppwrapper.h
#pragma once

#include <windows.h>

// 导出c风格函数供java调用
extern "c" __declspec(dllexport) int addfromcsharp(int a, int b);

// 实现:调用c#的add方法
int addfromcsharp(int a, int b) {
    // 创建c#对象
    csharplibrary::calculator^ calc = gcnew csharplibrary::calculator();
    return calc->add(a, b);
}

编译为dll

  • 创建c++ dll项目,引用 csharplibrary.dll,输出文件为 cppmethod.dll

步骤3:java用jni/jna调用c++ dll

方法a:jni(java native interface)

// nativeexample.java
public class nativeexample {
    // 加载c++ dll
    static {
        system.loadlibrary("cppmethod"); // 加载cppmethod.dll
    }

    // 声明本地方法
    public native static int addfromcsharp(int a, int b);

    public static void main(string[] args) {
        int result = addfromcsharp(3, 5);
        system.out.println("结果:" + result); // 输出“结果:8”
    }
}

方法b:jna(java native access)

// cpplibrary.java
import com.sun.jna.library;
import com.sun.jna.native;
import com.sun.jna.platform;

public interface cpplibrary extends library {
    cpplibrary instance = native.load("cppmethod", cpplibrary.class); // 加载cppmethod.dll
    int addfromcsharp(int a, int b); // 对应c++导出的addfromcsharp函数
}

// 调用示例
public class jnaexample {
    public static void main(string[] args) {
        int result = cpplibrary.instance.addfromcsharp(3, 5);
        system.out.println("结果:" + result); // 输出“结果:8”
    }
}

方法2:jna魔法——java直接调用c#的c接口

“jna是‘魔法师’,java直接调用c#!只要c#穿‘c外衣’!”

步骤1:c#生成c风格接口

// csharpcinterface.cs
using system;
using system.runtime.interopservices;

// 用c风格导出函数
[dllimport("kernel32.dll", charset = charset.auto, setlasterror = true)]
[return: marshalas(unmanagedtype.bool)]
public static extern bool freelibrary(intptr hmodule);

public class csharpcinterface {
    [dllexport("addfromcsharp", callingconvention = callingconvention.cdecl)]
    public static int addfromcsharp(int a, int b) {
        return a + b;
    }
}

编译为dll

  • 使用 dllmain.cpp 或 csharpcinterface.csproj 配置导出c函数
  • 输出文件为 csharpcinterface.dll

步骤2:java用jna调用c# dll

// csharplibrary.java
import com.sun.jna.library;
import com.sun.jna.native;
import com.sun.jna.platform;

public interface csharplibrary extends library {
    csharplibrary instance = native.load("csharpcinterface", csharplibrary.class); // 加载csharpcinterface.dll
    int addfromcsharp(int a, int b); // 对应c#导出的addfromcsharp函数
}

// 调用示例
public class jnaexample {
    public static void main(string[] args) {
        int result = csharplibrary.instance.addfromcsharp(3, 5);
        system.out.println("结果:" + result); // 输出“结果:8”
    }
}

方法3:com互操作——java调用c#的com组件

“com是‘外交官’,java通过它调用c#!代码详解全都有!”

步骤1:c#创建com组件

// csharpcomlibrary.cs
using system;
using system.runtime.interopservices;

// 定义com接口
[comvisible(true)]
[guid("a1b2c3d4-e5f6-7890-abcd-1234567890ef")]
[interfacetype(cominterfacetype.interfaceisdual)]
public interface icalculator {
    int add(int a, int b);
}

// 实现com接口
[comvisible(true)]
[guid("a1b2c3d4-e5f6-7890-abcd-1234567890ff")]
[classinterface(classinterfacetype.none)]
public class calculator : icalculator {
    public int add(int a, int b) {
        return a + b;
    }
}

注册com组件

  • 在visual studio中启用com可见性(项目属性 → 应用程序 → 启用com可见性)
  • 用 regsvr32 或 regasm 注册dll

步骤2:java调用com组件

方法a:使用jacob(java com bridge)

// comexample.java
import com.jacob.activex.activexcomponent;
import com.jacob.com.dispatch;
import com.jacob.com.variant;

public class comexample {
    public static void main(string[] args) {
        activexcomponent calculator = new activexcomponent("csharpcomlibrary.calculator");
        dispatch calcdispatch = calculator.getactivexcomponent();
        variant result = dispatch.call(calcdispatch, "add", 3, 5);
        system.out.println("结果:" + result.getint()); // 输出“结果:8”
    }
}

方法b:使用jacob或com4j

  • jacob和com4j是java调用com的常用库,需下载并配置jar

实战演练:3种方法对比与选择

方法优点缺点适用场景
c++/cli桥梁稳定性强,兼容性好需额外编译步骤,维护成本高企业级复杂系统
jna魔法简单易用,无需c++需c#导出c接口,性能稍弱快速原型开发
com互操作原生windows集成依赖注册表,跨平台困难windows桌面应用

常见问题:那些年我们踩过的坑

问题解决方案
找不到dll将dll复制到java的java.library.path目录
jna报错“找不到函数”检查c#是否正确导出c接口,函数名是否匹配
com注册失败用管理员权限运行注册命令,检查guid是否唯一
c++/cli编译错误确保c# dll和c++项目引用一致,启用c++/cli支持

java与c#的“跨国婚姻”指南!

“java和c#是‘异国情侣’?3种方法让它们‘无缝恋爱’!看完这篇文章,你也能成为‘跨语言专家’!”

通过本文,你已经掌握了:

  • c++/cli桥梁:用c++/cli搭建java ↔ c#的“翻译官”
  • jna魔法:java直接调用c#的c接口
  • com互操作:java调用c#的com组件

以上就是java调用c#动态库的三种方法详解的详细内容,更多关于java调用c#动态库的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com