工具箱之 IKVM.NET 項目新進展

来源:https://www.cnblogs.com/shanyou/archive/2022/06/29/16421954.html
-Advertisement-
Play Games

在各種群里經常討論的一個事情是.NET 如何調用 Java 的實現,最常見的場景之一就是在加解密方面Java提供的密鑰,C#無法解密, C#中byte範圍是[0,255],而Java中的byte範圍是[-128,127],由於密碼生成器是java所獨有的,其它語言都不支持(IOS,ANDROID,C ...


在各種群里經常討論的一個事情是.NET 如何調用 Java 的實現,最常見的場景之一就是在加解密方面Java提供的密鑰,C#無法解密, C#中byte範圍是[0,255],而Java中的byte範圍是[-128,127],由於密碼生成器是java所獨有的,其它語言都不支持(IOS,ANDROID,C#,.NET等),既然java這麼特立獨行,我們用上的解決方案那麼就是Java 範的。

Java和.NET是目前軟體開發的兩種主要技術,Java 8雖然是一種較舊的技術,已經完成了大量的工作。因此,當涉及到可重用性時,在.NET中使用在Java中創建的庫是一種非常普遍的做法。假設您已經在 Java 中開發了一個庫,並且想要在 .NET 項目中使用它,那麼 IKVM.NET 有助於在 .NET 中使用 Java 庫。

這就是今天我們要引入的主角 IKVM.NET , IKVM.NET 項目的歷史非常悠久,早在2006 年我在博客上寫了一篇文章 《在.NET平臺上運行Java程式-IKVM.NET入門》[1], IKVM.NET和 Mono 一樣都是.NET 開源史前的社區項目,IKVM 是一個 Java 到 .NET Framework的編譯器,而 Mono 是 .NET Framework的開源、跨平臺版本。2017年IKVM.NET作者決定放棄IKVM.NET的開發工作,從此之後社區里有人分叉了IKVM.NET 並繼續工作,雖然開發工作不是很積極, 不過從2022年3月份至今開發就非常活躍了(https://github.com/ikvm-revived/ikvm)[2],現在完全可以支持.NET 6了:

image

IKVM.NET 包括以下三個主要組件:

  1. 在.NET中實現的Java虛擬機:它有一個使用C#.NET開發的JVM,它提供了位元組碼轉換和驗證,類載入等功能,當前支持Java 8,這也是Java 使用最多的版本。
  2. Java類庫的.NET實現:它基本上使用OpenJDK[3]項目來實現JDK庫。
  3. 支持 Java 和 .NET 互操作性的工具:IKVM.NET 包括以下工具:

    a) ikvm:Java 虛擬機: 我們可以將其與java.exe(“動態模式”)進行比較。它載入一個類文件並執行其 main 方法,如果我們將類文件名作為參數傳遞,那麼它將在可執行 jar 文件中執行 Java 代碼。如果我們將一個jar文件作為參數傳遞,那麼它將執行它。

    b) ikvmc:將 Java 位元組碼編譯為 CIL, 用於將 Java 類和 jar 編譯為 .NET 程式集(“靜態模式”)。此工具將 Java 位元組碼轉換為 .NET DLL 和 exe。它將輸入文件中的 Java 位元組碼轉換為 .NET DLL。因此,當我們傳遞多個jar文件和類文件時,它將將它們組合在一起並生成單個exe或DLL文件。是 exe 還是 DLL 取決於傳遞的類文件和 jar 文件是否具有 Main 方法。如果他們有一個Main方法,那麼它將生成一個exe,否則DLL。

    c) ikvmstub:從 .NET 程式集生成 Java 存根類: 它從 .NET 程式集生成存根類文件,以便可以針對 .NET 代碼編譯 Java 代碼。ikvmstub 工具從 .NET 程式集生成 Java 存根。ikvmstub 讀取指定的程式集並生成一個包含 Java 介面和存根類的 Java jar 文件。

IKVM.NET 對於各種軟體開發方案非常有用。以下是一些可能性的樣本。

  1. 插入式 JVM 發行版中包含的 IKVM 應用程式是 Java 虛擬機的 .NET 實現。在許多情況下,您可以將其用作 Java 的直接替代品。例如,無需鍵入“java -jar myapp.jar”來運行應用程式,您可以鍵入:ikvm -jar myapp.jar
  2. 在 .NET 應用程式中使用 Java 庫,IKVM.NET 包括 ikvmc,一個 Java 位元組碼到 .NET IL 轉換器。如果你有一個Java庫,你想在.NET應用程式中使用,然後運行“ikvmc -target:library mylib.jar”來創建“mylib.dll”。 例如,Apache FOP項目是一個用Java編寫的開源XSL-FO處理器,廣泛用於從XML源生成PDF文檔。藉助 IKVM.NET 技術,Apache FOP可以被任何.NET應用程式使用。
  3. 用 Java 開發 .NET 應用程式 IKVM 為您提供了一種用 Java 開發 .NET 應用程式的方法。雖然 IKVM.NET 不包括用於.NET的Java編譯器,但您可以使用任何Java編譯器將Java源代碼編譯為JVM位元組碼,然後使用“ikvmc -target:exe myapp.jar”來生成.NET可執行文件。您甚至可以使用包含的 ikvmstub 應用程式在 Java 代碼中使用 .NET API。

支持平臺

  • .NET Framework 4.6.1 及更高版本
  • .NET Core 3.1 及更高版本
  • .NET 5 及更高版本
  • Java SE 8

IkvmReference

IKVM 包括生成時支持將 Java 庫轉換為 .NET 程式集,這是最近加入的功能特性,具體可以參見 IkvmReference 設計方案[4]。在要引用 Java 庫的項目中安裝包。使用IkvmReference 來指示您的項目需要哪些 Java 庫。

例:

    <ItemGroup>
        <IkvmReference Include="..\..\ext\helloworld-2.0.jar" />
    </ItemGroup>

輸出程式集將作為項目生成過程的一部分生成。可以向IkvmReference 其他元數據添加以自定義生成的程式集。

  • Identity:項目的標識可以是 a) JAR 文件的路徑 b) 目錄的路徑或 c) 其他不重要的名稱。IkvmReference
  • AssemblyName:預設情況下,使用規範定義的規則生成 。要覆蓋此內容,請在此處執行此操作。AssemblyNameAutomatic-Module-Name
  • AssemblyVersion:預設情況下,使用規範定義的規則生成 。要覆蓋此內容,請在此處執行此操作。AssemblyVersionAutomatic-Module-Name
  • DisableAutoAssemblyName:如果禁用 檢測 。trueAssemblyName
  • DisableAutoAssemblyVersion:如果禁用 檢測 。trueAssemblyVersion
  • FallbackAssemblyName:如果未提供或無法計算,請使用此值。AssemblyName
  • FallbackAssemblyVersion:如果未提供或無法計算,請使用此值。AssemblyVersion
  • Compile:可選的以分號分隔的 Java 類路徑項列表,以編譯到程式集中。預設情況下,如果項目的標識是現有的 JAR 文件或目錄(尚不受支持),則此值是項目的值。支持 MSBuild 客戶端引用多個 JAR 或.class文件。Identity
  • Sources:在文檔生成期間要使用的 Java 源文件的可選分號分隔列表。(尚不支持)
  • References:可選的以分號分隔的其他標識值列表,以指定為對當前標識值的引用。例如,如果依賴於 ,則將兩者都作為項包括在內,但在 元數據上指定 的標識。IkvmReferencefoo.jarbar.jarIkvmReferencebar.jarReferencesfoo.jar
  • Debug:指示是否生成調試符號(不可移植)的可選布爾值。預設情況下,這是根據項目的整體設置確定的。
  • MSBuild 項組定義支持的所有其他元數據。Reference

IkvmReference不可傳遞。將其包含在一個項目中並從第二個項目向該項目添加依賴項不會導致在第二個項目上提供相同的引用。而是添加對每個項目的引用。

對於要解析為相同生成的程式集的每個項目,請確保其設置相同。

<ItemGroup> <IkvmReference Include="helloworld.jar"> <AssemblyVersion>1.0.0.0</AssemblyVersion> </IkvmReference> <IkvmReference Include="helloworld-2.jar"> <AssemblyName>helloworld-2</AssemblyName> <AssemblyVersion>2.0.0.0</AssemblyVersion> <References>helloworld.jar</References> <Aliases>helloworld2</Aliases> </IkvmReference> </ItemGroup>


相關鏈接:

[1]在.NET平臺上運行Java程式-IKVM.NET入門:https://www.cnblogs.com/shanyou/articles/343118.html

[2]ikvm Github複活倉庫: https://github.com/ikvm-revived/ikvm

[3]OpenJDK: http://openjdk.java.net/

[4]IkvmReference 設計方案:https://github.com/ikvm-revived/ikvm/issues/54

歡迎大家掃描下麵二維碼成為我的客戶,為你服務和上雲


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

-Advertisement-
Play Games
更多相關文章
  • 參考:(17條消息) 手把手搭建一個完整的javaweb項目(適合新手)_心歌技術的博客-CSDN博客_javaweb項目完整案例 補充項目結構的細節,進行了一點修改,修改為學生信息管理系統 以下是搭建過程: 1.項目結構 2.資料庫結構 3.代碼部分 com.dao.StuDao.java pac ...
  • 背景:[JAVA]前幾天面試超碧,聊到其接觸的項目,有抓取各類排行的實時數據,進行多國語言翻譯,抓取目前比較火的語言是php、go,由於目前工作使用JAVA,因此也模擬實現了一下抓取百度熱搜榜實時數據。 效果: 步驟: 1、定址【百度熱搜榜】https://top.baidu.com/board?t ...
  • java集合 學習資源:b站 人人都是程式員 《看動畫學java集合》 b站 韓順平 《java集合》 感謝二位的開源視頻,本博客為個人筆記,如有錯誤還請包涵 學習方法:推薦觀看視頻,自己用idea敲一遍然後debug一步步看,最後自己寫筆記和畫流程圖。 前 言 目的:為了方便和高效地存儲大批量的數 ...
  • Hi,大家好,我是Mic。 一個工作5年的粉絲,在簡歷上寫精通Kafka。 結果在面試的時候直接打臉。 面試官問他:“什麼是ISR,為什麼需要設計ISR” 然後他一臉懵逼的看著面試官. 下麵看看普通人和高手的回答。 普通人: ISR好像是Kafka裡面的一個機制吧。 為什麼要引入,應該是跟數據同步有 ...
  • runAsync 和 supplyAsync runAsync接受一個Runable的實現,無返回值 CompletableFuture.runAsync(()->System.out.println("無返回結果的運行")); supplyAsync接受一個Supplier的實現,有返回值 Com ...
  • 前言 🗯 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 水印這個詞相信大家已經不陌生了,畢竟現今天, 視頻有水印,圖片有水印,甚至一些電商平臺的展示圖也有水印 🍬 於是今天我就來分享一個python添加水印的方法~學會後你就不用自己去添加水印了, 只需要點一下運行~ python它自己自己給你弄好啦! ...
  • Sorted Set (ZSet) 數據結構 Sorted Set (ZSet), 即有序集合, 底層使用 壓縮列表(ziplist) 或者 跳躍表(skiplist) 使用 壓縮列表(ziplist) 當同時滿足下麵兩個條件時,使用 ziplist 存儲數據 元素個數少於128個 (zset-ma ...
  • 在程式開發過程中,我們一般會用到配置文件來設定一些參數。常見的配置文件格式為 **ini**, **xml**, **config**等。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...