實現通過COM組件方式實現java調用C#寫的DLL文件的完整demo

来源:https://www.cnblogs.com/guhuazhen/archive/2019/07/23/11230933.html
-Advertisement-
Play Games

最近因為工作需要,客戶那邊工程師使用的是JAVA語言開發的程式,我們這邊平臺中是用C#語言開發的,因為有些操作必須統一,所以我在網上查找解決方法,自己也實踐過,在這裡做個筆記吧,分享一下。 一、使用C#編寫com組件 開發環境 :VS2017 1、新建工程:CalcTest(類庫項目,根據自己喜好需 ...


最近因為工作需要,客戶那邊工程師使用的是JAVA語言開發的程式,我們這邊平臺中是用C#語言開發的,因為有些操作必須統一,所以我在網上查找解決方法,自己也實踐過,在這裡做個筆記吧,分享一下。

一、使用C#編寫com組件
  開發環境 :VS2017
  1、新建工程:CalcTest(類庫項目,根據自己喜好需要取工程名,框架我這裡使用的是:.NET Framework 4 ,你可以根據自己的來選。 (註:下麵紅色框和箭頭和需要註意的地方)

  

2、右鍵項目屬性,點擊項目屬性,看到下麵這個界面,點擊紅色框框"程式集信息,使程式集com可見,打上勾,如下圖所示

程式集中其他信息可以根據個人喜好可寫可不寫。

 3、選擇生成看到以下界面,平臺目標選擇:X64, 為COM互操作註冊(C) 勾上,如下圖操作。

 

 4、接下來是設置強簽名,要以管理員的身份運行

  ①.找到Visual Studio Command Prompt (VS2017 開發人員命令提示)

        輸入命令:sn -k D:/CalcComkey.snk 

     這裡我生成的CalcComkey.snk 文件放在D盤,註意選擇你自己的保存路徑。
        VS2017 開發人員命令提示工具的路徑是安裝VS2017 路徑下,你可以自己找一下,每個人安裝位置不一樣。
        比如我的是 :  C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools

 5、在簽名 標簽中選中 為程式集簽名,選擇剛剛生成的強名稱文件CalcComkey.snk 。

 

6、創建GUID

  通過點擊工具 => 創建GUID => 選擇4 => New Guid => copy => 替換下麵  C#代碼中的兩個 GUID 值

創建GUID,新建複製,粘貼到代碼中去就可以,把代碼中那兩個都替換掉。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace CalcTest
{
    [Guid("68E2A6FD-F437-4107-A6DB-E78714EC8D8B")] //GUID值
    interface ICalc
    {
          [DispId(1)]
          int Add(int a, int b);    //返回的int值,與需要調用的類的方法名一致。
    }
    [Guid("60D60EE5-EAF3-482C-BE33-DED6BE635111"), ClassInterface(ClassInterfaceType.None)]     //GUID值
    public class Calc : ICalc    //類名,介面名 ,必須定義介面
    {
        public Calc() { }
        //定義具有兩個參數的方法,返回計算結果。根據各自需要定義。
        public int Add(int  a, int b)     
        {
            return a+b;
        }
    }
}

7、編譯生成程式,Debug目錄中會生成 CalcTest.dll 和CalcTest.tlb。

 

 二、java調用C#編寫com組件

一、準備工作

1、剛剛上文中我們生成的兩個文件,CalcTest.dll 、 CalcTest.tlb,先保存起來,一會兒會用到。

命名空間為:CalcTest、類名為:Calc

2、jacob下載,可以自主下載,這裡提供一個,下麵是百度網盤的地址和提取碼:

       鏈接:https://pan.baidu.com/s/1U_2NDpQvmScSB9_fICW9Ig

提取碼:s60u

二、實現步驟

1、將CalcTest.dll、CalcTest.tlb複製到JAVA開發環境中,JAVA環境中需要安裝對應版本的.net framework 

 註:JAVA開發環境指JDK下的bin目錄,我的是win7的系統,預設就安裝了.NET Framework 4.0

2、JAVA開發環境中註冊新生成的com組件,在客戶環境中,通過regasm.exe註冊com組件。

Regasm.exe預設安裝路徑為:C:\Windows\Microsoft.NET\Framework\v2.0.50727

 

 

註:因為上面我們選擇的是X64平臺,因此框架是選擇Framework64,路徑為:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319

還有步驟1的意思就是,把CalcTest.dll、CalcTest.tlb複製到這個路徑下麵C:\Windows\Microsoft.NET\Framework64\v4.0.30319

註:圖片中的InvokeTest.dll和Invoke.tlb就是我們上文的CalcTest.dll、CalcTest.tlb

 

 

①、按下win+R,輸入cmd進入控制面板

②、輸入 cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

③、接下來,手動註冊COM方法:運行命令(管理員身份運行)

④、regasm CalcTest.DLL /CalcTest.tlb

出現以下界面說明註冊成功:

註:圖片中的InvokeTest.dll和Invoke.tlb就是我們上文的CalcTest.dll、CalcTest.tlb

 

 

3、強簽名的dll文件添加到緩存中

1、首先找到gacutil路徑為:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools

註:也有可能在這裡路徑下麵找不到gacutil那麼就去下載一個或者找一下其他地方的複製過來,我一開始就沒有這個bin文件夾,從其他地方拷貝過來的。

 註:圖片中的InvokeTest.dll和Invoke.tlb就是我們上文的CalcTest.dll、CalcTest.tlb

 

2、接下來就是要將dll添加到緩存中

①、按下win+R,輸入cmd進入控制面板

②、輸入

cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools

③、執行命令: 執行這個命令需要InvokeTest.DLL 具有強名稱

gacutil -i C:\Program Files\Java\jdk1.8.0_181\bin\InvokeTest.DLL

註:上面這個路徑因人而異,找到你自己jdk的存放路徑,把InvokeTest.dll、InvokeTest.tlb放到bin文件夾下麵。

註:圖片中的InvokeTest.dll和Invoke.tlb就是我們上文的CalcTest.dll、CalcTest.tlb

 

 

Ok,dll添加到緩存中的操作就完成了,看到以下界面就說明成功添加了

 

或者

 

 

 

4、查看註冊表regedit,HKEY_CLASSES_ROOT中是否有InvokeTest.MyMd5 項,如果有說明註冊COM成功。如果沒有,請重新註冊。重覆上面過程。

查看註冊表,不知道怎麼操作的,下麵鏈接可以打開看,或者自己上網查。

https://jingyan.baidu.com/article/295430f10e5cc80c7e00500d.html

看到以下界面說明註冊成功了

註:圖片中的InvokeTest.MyMd5就是我們上文的CalcTest.Calc,因為節省時間,我上文給大家演示了一遍,下麵這個是按照我實踐過的例子貼的經驗,

 

 

三、Java項目調用

1、新建項目,引用jacob.jar

2、實現,直接貼代碼

package test;

//=================導包=======================

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.ComThread;

import com.jacob.com.Dispatch;

import com.jacob.com.Variant;  

//=================導包=======================
public class main {

public static void main(String[] args) {
// TODO Auto-generated method stub
  try
  {  
         ComThread.InitSTA();
         ActiveXComponent dotnetCom = null;   
         //需要調用的C#代碼中的命名空間名和類名。
         dotnetCom = new ActiveXComponent("CalcTest.Calc");
     //需要調用的方法名和參數值
      Variant var = Dispatch.call(dotnetCom,"Add",1,2);
          String str2  = var2.toString();  //返回需要的字元串   
          System.out.println(str2.toString());//列印結果,結果等於3

        } 
     catch (Exception ex)
        {
         ex.printStackTrace();    
        }
    
finally { ComThread.Release(); } } }

 

聲明:下麵操作主要分為兩部分,第一部分使用C#編寫com為了寫這篇文章我是新建的操作demo,

第二部分java調用c#編寫的com組件,因為是工作時的demo,因為當時有給客戶寫了使用說明,在這裡拿一些截圖出來用一下,為了節省時間,我就不再操作一遍了,如有不理解的可以留言。

ok,對於整個操作過程就分享到這裡了,如果有不理解的,或者我有講的不對的請幫忙指出,謝謝。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
  • import os def file_handler(backend_data,res=None,type='fetch'): # 查詢功能 if type == 'fetch': with open('test_new.txt','r') as read_f: ret = [] ... ...
  • 介紹 使用函數式編程來豐富面向對象編程的想法是陳舊的。將函數編程功能添加到面向對象的語言中會帶來面向對象編程設計的好處。 一些舊的和不太老的語言,具有函數式編程和麵向對象的編程: 例如,Smalltalk和Common Lisp。 最近是Python或Ruby。 面向對象編程中模擬的函數式編程技術 ...
  • 1.背景 由於歷史原因,筆者所在的公司原有的ES查詢驅動採用的是 PlainElastic.Net, 經過詢問原來是之前PlainElastic.Net在園子里文檔較多,上手比較容易,所以最初作者選用了該驅動,而發佈也由於歷史原因都部署在 windows 伺服器上,基於 .NET Framework ...
  • 一、C#實現本地文件下載 1、文件下載的路徑 文件名稱 以及文件下載之後要放的位置 這三個變數是必須要的 2、定義以下四個對象: FileWebRequest ftpWebRequest = null; FileWebResponse ftpWebResponse = null; Stream ft ...
  • 小白開學Asp.Net Core 《九》 — — 前端篇(不務正業) 在《小白開學Asp.Net Core 三》中使用了X-admin 2.x 和 Layui將管理後端的界面重新佈局了,裡面簡單的介紹了layui table 的使用以及頁面table所需的數據做了簡單的封裝。今天擴展學習下。 一、L ...
  • ADO.NET進行參數化時會自動將參數值包含在單引號中,除了特殊需求,最好不要自己手動添加單引號。ADO.NET中識別參數標識是使用符號@,如果在SQL語句中將參數標識放在單引號中,單引號中的參數標識只會被當成字元串! 所以要對LIKE語句進行參數化查詢時,就要先對參數值進行格式化,在傳參之前就設置 ...
  • 本地化(Localization)也就是多語言功能,藉此用戶能夠選擇他的母語或熟悉的語言來使用系統,這顯然非常有利於軟體系統推向國際化。一個應用程式的UI界面至少有一種語言,ABP開發框架提供了一個彈性的多語言框架,可以簡化我們在多語言方面的開發時間。利用ABP實現多語言只需要簡單地完成三個步驟:建... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...