欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java調(diào)用C#動態(tài)庫的三種方法詳解

 更新時間:2025年06月08日 13:46:56   作者:墨瑾軒  
在這個多語言編程的時代,Java和C#就像兩位才華橫溢的舞者,各自在不同的舞臺上展現(xiàn)著獨特的魅力,然而,當它們攜手合作時,又會碰撞出怎樣絢麗的火花呢?今天,我們就來探討一下Java調(diào)用C#動態(tài)庫的三種方法,需要的朋友可以參考下

方法1:C++/CLI搭建橋梁——Java ↔ C# 的“翻譯官”

“C++/CLI是‘雙語老師’,Java通過它調(diào)用C#!代碼詳解看這里!”

步驟1:創(chuàng)建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創(chuàng)建類庫項目,輸出文件為 CSharpLibrary.dll

步驟2:用C++/CLI創(chuàng)建包裝器

“C++/CLI是‘翻譯官’,把C#的‘中文’翻譯成C++的‘英文’!”

// CppWrapper.h
#pragma once

#include <windows.h>

// 導出C風格函數(shù)供Java調(diào)用
extern "C" __declspec(dllexport) int AddFromCSharp(int a, int b);

// 實現(xiàn):調(diào)用C#的Add方法
int AddFromCSharp(int a, int b) {
    // 創(chuàng)建C#對象
    CSharpLibrary::Calculator^ calc = gcnew CSharpLibrary::Calculator();
    return calc->Add(a, b);
}

編譯為DLL

  • 創(chuàng)建C++ DLL項目,引用 CSharpLibrary.dll,輸出文件為 CppMethod.dll

步驟3:Java用JNI/JNA調(diào)用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("結(jié)果:" + result); // 輸出“結(jié)果: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); // 對應(yīng)C++導出的AddFromCSharp函數(shù)
}

// 調(diào)用示例
public class JnaExample {
    public static void main(String[] args) {
        int result = CppLibrary.INSTANCE.AddFromCSharp(3, 5);
        System.out.println("結(jié)果:" + result); // 輸出“結(jié)果:8”
    }
}

方法2:JNA魔法——Java直接調(diào)用C#的C接口

“JNA是‘魔法師’,Java直接調(diào)用C#!只要C#穿‘C外衣’!”

步驟1:C#生成C風格接口

// CSharpCInterface.cs
using System;
using System.Runtime.InteropServices;

// 用C風格導出函數(shù)
[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函數(shù)
  • 輸出文件為 CSharpCInterface.dll

步驟2:Java用JNA調(diào)用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); // 對應(yīng)C#導出的AddFromCSharp函數(shù)
}

// 調(diào)用示例
public class JnaExample {
    public static void main(String[] args) {
        int result = CSharpLibrary.INSTANCE.AddFromCSharp(3, 5);
        System.out.println("結(jié)果:" + result); // 輸出“結(jié)果:8”
    }
}

方法3:COM互操作——Java調(diào)用C#的COM組件

“COM是‘外交官’,Java通過它調(diào)用C#!代碼詳解全都有!”

步驟1:C#創(chuàng)建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);
}

// 實現(xiàn)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可見性(項目屬性 → 應(yīng)用程序 → 啟用COM可見性)
  • 用 regsvr32 或 regasm 注冊DLL

步驟2:Java調(diào)用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("結(jié)果:" + result.getInt()); // 輸出“結(jié)果:8”
    }
}

方法B:使用Jacob或Com4j

  • Jacob和Com4j是Java調(diào)用COM的常用庫,需下載并配置JAR

實戰(zhàn)演練:3種方法對比與選擇

方法優(yōu)點缺點適用場景
C++/CLI橋梁穩(wěn)定性強,兼容性好需額外編譯步驟,維護成本高企業(yè)級復雜系統(tǒng)
JNA魔法簡單易用,無需C++需C#導出C接口,性能稍弱快速原型開發(fā)
COM互操作原生Windows集成依賴注冊表,跨平臺困難Windows桌面應(yīng)用

常見問題:那些年我們踩過的坑

問題解決方案
找不到DLL將DLL復制到Java的java.library.path目錄
JNA報錯“找不到函數(shù)”檢查C#是否正確導出C接口,函數(shù)名是否匹配
COM注冊失敗用管理員權(quán)限運行注冊命令,檢查GUID是否唯一
C++/CLI編譯錯誤確保C# DLL和C++項目引用一致,啟用C++/CLI支持

Java與C#的“跨國婚姻”指南!

“Java和C#是‘異國情侶’?3種方法讓它們‘無縫戀愛’!看完這篇文章,你也能成為‘跨語言專家’!”

通過本文,你已經(jīng)掌握了:

  • C++/CLI橋梁:用C++/CLI搭建Java ↔ C#的“翻譯官”
  • JNA魔法:Java直接調(diào)用C#的C接口
  • COM互操作:Java調(diào)用C#的COM組件

以上就是Java調(diào)用C#動態(tài)庫的三種方法詳解的詳細內(nèi)容,更多關(guān)于Java調(diào)用C#動態(tài)庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java日常練習題,每天進步一點點(40)

    Java日常練習題,每天進步一點點(40)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • java實現(xiàn)簡單學生成績檔案管理系統(tǒng)

    java實現(xiàn)簡單學生成績檔案管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單學生成績檔案管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java中怎樣使用JSON進行文件解析

    Java中怎樣使用JSON進行文件解析

    這篇文章主要介紹了Java中怎樣使用JSON進行文件解析問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • SpringBoot集成cache緩存的實現(xiàn)

    SpringBoot集成cache緩存的實現(xiàn)

    日常開發(fā)中,緩存是解決數(shù)據(jù)庫壓力的一種方案,本文記錄springboot中使用cache緩存。需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • 詳解在Java中如何優(yōu)雅的停止線程

    詳解在Java中如何優(yōu)雅的停止線程

    線程,作為并發(fā)編程的基礎(chǔ)單元,允許程序同時執(zhí)行多個任務(wù),在Java中,線程可以理解為程序中的獨立執(zhí)行路徑,通過使用線程,開發(fā)者可以創(chuàng)建更加響應(yīng)靈敏、效率更高的應(yīng)用程序,本文小編將給大家介紹一下Java中如何優(yōu)雅的停止線程,需要的朋友可以參考下
    2023-11-11
  • 在Java中讀取和解析JSON文件的示例代碼

    在Java中讀取和解析JSON文件的示例代碼

    我們在日常開發(fā)中少不了和JSON數(shù)據(jù)打交道,JSON是輕量、結(jié)構(gòu)化的數(shù)據(jù)交換格式,支持跨語言,本文給大家詳細介紹了如何在 Java 中讀取和解析 JSON 文件,并有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2025-06-06
  • spring?controller層引用service報空指針異常nullpointExceptio問題

    spring?controller層引用service報空指針異常nullpointExceptio問題

    這篇文章主要介紹了spring?controller層引用service報空指針異常nullpointExceptio問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 關(guān)于Spring不同類型的注入方式 p-namespace,c-namespace

    關(guān)于Spring不同類型的注入方式 p-namespace,c-namespace

    這篇文章主要介紹了Spring不同類型的注入方式 p-namespace,c-namespace。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • jsoup?框架的使用小結(jié)

    jsoup?框架的使用小結(jié)

    jsoup 是一款基于Java的HTML解析器,它提供了一套非常省力的API,不但能直接解析某個URL地址、HTML文本內(nèi)容,而且還能通過類似于 DOM、CSS 或者jQuery的方法來操作數(shù)據(jù),所以jsoup也可以被當做爬蟲工具使用,這篇文章主要介紹了jsoup使用,需要的朋友可以參考下
    2023-04-04
  • 淺析JDK12的五大重要新特性(推薦)

    淺析JDK12的五大重要新特性(推薦)

    這篇文章主要介紹了JDK12的五大重要新特性,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05

最新評論