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

01503f954b4b2ae5143f7d8041fc42c1.jpeg在各種群里經常討論的一個事情是.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 的編譯器,而 Mono 是 .NET Framework的開源、跨平臺版本。2017年IKVM.NET作者決定放棄IKVM.NET的開發工作,從此之后社區里有人分叉了IKVM.NET 并繼續工作,雖然開發工作不是很積極, 不過從2022年3月份至今開發就非常活躍了(https://github.com/ikvm-revived/ikvm)[2],現在完全可以支持.NET 6了:

7fde11bf90d0fe03ff0cb2e83015c5fd.png

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285430.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據庫原理及應用】經典題庫附答案(14章全)——第十四章:分布式數據庫系統

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

一天一種設計模式之六-----工廠方法模式

2019獨角獸企業重金招聘Python工程師標準>>> 一.工廠方法模式 工廠方法模式屬于創建型模式。工廠方法模式定義&#xff1a;定義一個用于創建對象的借口&#xff0c;讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到了他的子類。一般工廠類會有一個工廠的接…

[轉]IPython介紹

1. IPython介紹 ipython是一個python的交互式shell&#xff0c;比默認的python shell好用得多&#xff0c;支持變量自動補全&#xff0c;自動縮進&#xff0c;支持bash shell命令&#xff0c;內置了許多很有用的功能和函數。學習ipython將會讓我們以一種更高的效率來使用python…

.NET MAUI in Mac

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;4分鐘&#xff09;概要本篇文章主要分享MAUI在m1芯片的設備上運行和支持情況&#xff0c;將我們寫好的MAUI程序編譯為支持mac平臺的版本。在m1芯片剛剛出來的時候有很多開發工具和應用程序對m1芯片的支持不是很友好&a…

30分鐘時長千行代碼《C#程序設計基礎》經典程序,C#菜鳥開發必備!

作者:劉一哥GIS(CSDN博客專家) 博客地址:https://geostorm.blog.csdn.net/ 劉一哥,多年研究地圖學、地理信息系統、遙感、攝影測量和GPS等應用,精通ArcGIS、MapGIS、ENVI、Erdas、CASS、Pix4d、CC、PhotoScan、Inpho、EPS、Globalmapper等專業軟件的應用,精通多門編程語…

前端開發中的SEO

前端開發中的SEO 什么是SEO SEO由英文Search Engine Optimization縮寫而來&#xff0c;中文意譯為“搜索引擎優化”。SEO是指從自然搜索結果獲得網站流量的技術和過程&#xff0c;是在了解搜索引擎自然排名機制的基礎上&#xff0c;對網站進行內部及外部的調整優化&#xff0c;…

grep命令

請見附件&#xff1b;轉載于:https://blog.51cto.com/11203760/1750457

windows 常用系統變量

常用&#xff1a; %USERPROFILE% C:\Users\用戶名 %SystemRoot% C:\WINDOWS %SystemDrive% C: %APPDATA% C:\Users\用戶名\AppData\Roaming %LOCALAPPDATA% C:\Users\用戶名\AppData\Local %windir% C:\WINDOWS %Path% C:\Windows\system32;C:\Wi…

C# 自定義并動態切換光標

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;唐宋元明清的博客原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/14873136.html系統有很多光標類型 &#xff1a;Cursors 類 (System.Windows.Input) | Microsoft Docs[1]本章介紹如…

HTML基礎加強

1. 什么是瀏覽器&#xff1a;解釋和執行HTML源碼的工具。 2. 什么是靜態頁面&#xff0c;什么樣的頁面是動態頁面&#xff1f; 靜態頁面&#xff1a;htm&#xff0c;html&#xff08;直接讀取&#xff09; 動態網頁&#xff1a;asp&#xff0c;aspx&#xff0c;jsp&#xff0c;…

視頻播放器for android

寫在前面 好久沒有寫博客了, 中間忙了一堆雜七雜八的事情...工作, 情感, 未來, 人生... 下面是正文 一直要寫一個視頻播放器, 好練練手. 這個app, 從年前寫到現在, 終于算弄出了樣子, 0.0版本. (不得不說, googleVPN值得擁有, android developer網站, android sdk samples, sta…

我要偷偷學習C#,然后學習GIS二次開發之試題匯總(附答案)

一、單項選擇題(每小題2分,共20分) 在類作用域中能夠通過直接使用該類的( )成員名進行訪問。 A. 私有 B. 公用 C. 保護 D. 任何 答案:D 小數類型(decimal)和浮點類型都可以表示小數,正確說法:( ) A. 兩者沒有任何區別 B. 小數類型比浮點類型取值范圍大 C.小數類型比浮…

簡單粗暴無需拼接下載 blob (ts)視頻文件

網上很多視頻采用blob來播放視頻&#xff0c;查看源碼會發現video的src為形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

System.CommandLine版CSRebot

之前自己實現過一個CSRebot命令行工具&#xff0c;現在用System.CommandLine來實現&#xff0c;就規范和省事多了&#xff0c;雖然System.CommandLine還沒有正式發布&#xff0c;但它的實現思路還是很不錯的。下面的代碼只簡單實現了MSSQL庫生成C#體類的功能&#xff0c;其他庫…

Shell重定向

Liunx下系統打開的3個文件&#xff0c;即標準輸入、標注輸出和標準錯誤輸出。用戶的shell將鍵盤設為默認的標準輸入&#xff0c;默認的標準輸入和標準錯誤輸出為屏幕。也就是說&#xff0c;用戶從鍵盤輸入命令&#xff0c;然后將結果和錯誤消息輸入到屏幕所謂的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014啟動提示文件加載,怎么處理?

CASS9.2在安裝完后,首次啟動會提示如下圖樣提示,應該如何處理?請看以下步驟: 解決步驟: 1、安裝完CASS9.2_2014后,首次啟動CASS92,會出現如下圖所示提示。選擇“不加載”。 2、進入AutoCAD系統配置—系統頁面 打開系統頁面菜單 系統界面截圖

VS2015不能修改安裝路徑問題

能修改安裝路徑&#xff0c;固態硬盤空間太小&#xff0c;所以不能裝在C盤啊。 其中&#xff0c;原因是以前安裝過VS2015沒有卸載干凈&#xff0c;解決方法是&#xff1a;下載Visual Studio Uninstaller卸載完全&#xff08;要以管理員運行哈&#xff09; 下載地址&#xff1a;…

python 繪制分形樹

# -*- coding: utf8 -*- """ 繪制分形樹 """ import turtledeflection_angle 20 # 樹枝與樹干夾角 trunk_min_length 5 # 樹干最小長度 trunk_step_length 10 # 樹干每次遞減長度 trunk_length 80 # 初…

像JAVA一樣流暢調試C#源代碼?

起因最近在研究ServiceScope的內一些內在運行邏輯,發現相關資料非常少&#xff0c;只有講IOC相關的文章有說Core時代的官方依賴注入怎么使用。。遂決定還是要去看源代碼。這部分源代碼在Microsoft.Extensions.DependencyInjection庫中&#xff0c;源代碼位置在src/libraries[1]…

物化視圖VS普通視圖

2019獨角獸企業重金招聘Python工程師標準>>> 物化視圖是一種特殊的物理表&#xff0c;“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表&#xff0c;應用的局限性大&#xff0c;任何對視圖的查詢&#xff0c;Oracle都實際上轉換為視圖SQL語句的查…