JAVA と C# 共通ライブラリが作れないか相談。
ChatGPTの質疑はそのまま。誤植があってそれなりに応えてくれる場合と、
誤植がなくても、違う意味に捉えてしまうこともあります。
どちらも記録として保存しています。
CHatGPT
C#とJAAVの共通ライブラリはありますか?
ChatGPT:
いいご質問です。
結論から言うと、C#(.NET系)と Java の両方で「完全に共通のライブラリ」というものは基本的に存在しません。なぜなら、C# は .NET CLR、Java は JVM という別々の仮想マシン上で動作するため、バイナリ互換性がないからです。
ただし、両者で「共通に利用できる」または「移植が比較的容易」な仕組みやライブラリ群はいくつか存在します。
- 仕様レベルで共通するライブラリ
標準ライブラリに似た設計
Java の java.util.* と .NET の System.Collections.* はデータ構造やコレクションの思想が似ています。
スレッドや並行処理に関しても java.util.concurrent と .NET の System.Threading.Tasks は役割が近いです。- 移植性のあるライブラリ/フレームワーク
gRPC / Protocol Buffers / Thrift / Avro
→ 言語に依存しない IDL(インタフェース定義言語)で定義すれば、C# と Java 両方で利用可能。
JSON / XML ライブラリ
→ 例えば Newtonsoft.Json(C#)や Jackson(Java)は別実装ですが、仕様(JSON)に依存するためコード移植しやすい。
ログ出力フレームワーク
→ log4j(Java)と log4net(C#)は兄弟関係。概念的にほぼ共通。
データベースアクセス
→ JDBC (Java) と ADO.NET (C#) は異なるが、SQL を共通に扱える。
UI フレームワーク(Webベース)
→ 両者ともに JavaScript / HTML / CSS を利用できるので、Web アプリ基盤は共通化しやすい。- クロスプラットフォームで両者を橋渡しする技術
IKVM.NET
→ Java バイトコードを .NET 上で動かせる(ただしメンテナンス停滞中)。
JNI + C++/CLI 経由
→ C++ を介して共通のネイティブライブラリを呼び出す方法。
WebAssembly (WASM)
→ 将来的には、C# も Java も WASM にコンパイルして「共通実行環境」を使える可能性がある。
✅ まとめ
「共通のバイナリをそのまま両者で使う」ものは基本的に 存在しない。
しかし gRPC / Protobuf / JSON / XML / log4x 系 のような「言語非依存仕様」に基づいたライブラリは両方で使える。
相互運用する場合は IDL やデータフォーマットレベルで共通化するのが現実的。
ご希望に合わせて、
🔹「両者でそのまま使えるクロスコンパイル環境」
🔹「概念的に対応している標準ライブラリ比較表」
のどちらかを詳しく整理できますが、どちらをご覧になりたいですか?
両者でそのまま使えるクロスコンパイル環境
ChatGPT:
なるほど!
「C# (.NET) と Java (JVM) の両方で そのまま使えるクロスコンパイル環境」という観点で整理しますね。
- バイトコード変換型(Java ⇔ .NET)
IKVM.NET
Java バイトコード(.jar)を .NET のアセンブリ(.dll/.exe)に変換するツールチェーン。
JVM ランタイムを .NET 上に移植しており、Java ライブラリをそのまま C# から呼び出せる。
一時期は活発だったが、公式の開発は停滞気味。フォーク版(IKVM 8, IKVM 9)がコミュニティで更新中。
JNBridge(商用)
Java と .NET の相互運用を可能にするブリッジ製品。
変換というより「双方向に呼び出し可能」にする仕組み。- 共通中間表現を使うタイプ
WebAssembly (WASM)
C#(Blazor / .NET 8+)も Java(TeaVM, CheerpJ など)も WASM にコンパイル可能。
ブラウザや WASI ランタイム上で両方が動く → 共通バイナリ形式。
まだ「業務アプリ全般を共通化」という段階には至っていないが、将来性あり。
LLVM 中間表現 (LLVM IR)
Java バイトコードを LLVM に変換(例: VMKit, GraalVM の一部機能)。
C# も .NET Core で LLVM バックエンドを使える実験的プロジェクトあり。
研究寄りで実用は限定的。- クロス言語コード生成
IDL(インタフェース定義言語)を介す方式
gRPC / Protocol Buffers / Thrift / Avro
一つの定義ファイル(.proto など)から C# と Java 両方のコードを自動生成。
これは「共通ライブラリのクロスコンパイル」ではなく「共通コードの自動生成」に近い。
高い実用性があり、マイクロサービスや分散システムで標準的。- 旧来の試み
DotGNU + Portable.NET(歴史的プロジェクト)
Java と .NET の相互運用を目指していたが開発終了。
Mono + IKVM の組み合わせ
Linux/Unix 上で Java ライブラリを .NET 環境から利用可能にしていた。
✅ まとめ
実用的でメンテされているのは IKVM(フォーク版) と IDL ベースのコード生成(gRPC/Protobuf 等)。
「バイナリそのまま動かす」という意味では IKVM が最有力。
「将来性」で見るなら WebAssembly が両者の共通ランタイムになりつつある。
👉 ご興味は、
実際に 手元で使えるツール(IKVM など)の具体的な導入方法 を知りたいですか?
それとも 将来的に使える WASM / GraalVM 系の展望 を深掘りした方がよいですか?
実際に 手元で使えるツール(IKVM など)の具体的な導入方法 を知りたい
ChatGPT:
了解しました 👍
では、いまでも「手元で動かせる」実用的な IKVM (フォーク版) を中心に、C# と Java を橋渡しする具体的な導入方法をご紹介します。
🔹 IKVM.NET の導入方法(JavaライブラリをC#で使う)
- IKVM を入手
IKVM のオリジナル開発は終了しましたが、フォークが維持されています。
IKVM 8 / 11 (フォーク)
.NET 6/7/8 に対応するビルドあり。
Windows / Linux / macOS で動作可。
インストール例(Windows / Linux 共通)
dotnet tool install --global IKVM.Maven.Sdk
または GitHub Release から ikvmc やランタイムをダウンロードして展開。- Java ライブラリ(.jar)を変換
例えば、Java の commons-lang3-3.12.0.jar を .NET DLL に変換します。
ikvmc -target:library commons-lang3-3.12.0.jar
これで commons-lang3-3.12.0.dll が生成されます。- C# プロジェクトに組み込み
変換した DLL を通常の C# プロジェクトから参照可能。
Program.cs の例
using System;
using org.apache.commons.lang3;
class Program
{
static void Main()
{
string reversed = StringUtils.reverse("Hello IKVM");
Console.WriteLine(reversed); // "MVKI olleH"
}
}
コンパイル & 実行すると、Java の StringUtils を C# から利用できます。
- 注意点
対応 JDK:IKVM 8 系は Java 8 ベース。IKVM 11 系で新しい JDK に対応中。
GUI 系 (Swing, AWT) は Windows でのみ部分的に動作。
パフォーマンスはネイティブ C# ライブラリより少し遅い場合がある。
逆方向(C# → Java) は JNBridge のような商用ツールの方が安定。
🔹 その他の選択肢
JNBridge(商用)
導入コストはかかるが、.NET ↔ Java の双方向呼び出しをサポート。
公式にサポートがあるので業務利用向き。
WebAssembly 実験
まだ成熟していないが、C# も Java も WASM にコンパイルして「共通環境」で動かす試みが進んでいる。
✅ まとめ
すぐに試したいなら → IKVM フォーク版を導入し、ikvmc で .jar → .dll に変換。
業務で堅牢に使いたいなら → JNBridge(商用)。
将来的な選択肢として → WebAssembly。
👉 実際にお手元で試せるように、
「Hello World レベルの jar → dll 変換から C# で呼び出すまでの手順」を私が一式サンプルでご用意しましょうか?
はい。お願いします。
ChatGPT:
了解しました 👍
では、Java の HelloWorld ライブラリを作り → IKVM で DLL に変換 → C# から呼び出す までを一式サンプルでご紹介します。
🔹 ステップバイステップ手順
- Java のクラスを用意する
HelloWorld.java
package sample;
public class HelloWorld {
public static String sayHello(String name) {
return "Hello from Java, " + name + "!";
}
}
コンパイルします(JDK が必要)。
javac HelloWorld.java
jar cvf HelloWorld.jar sample/HelloWorld.class
これで HelloWorld.jar ができます。
2. IKVM で DLL に変換
IKVM フォーク版をインストールしてある前提です。
ikvmc -target:library HelloWorld.jar
すると HelloWorld.dll が生成されます。
3. C# プロジェクトを作成
dotnet new console -n TestIKVM
cd TestIKVM
生成した HelloWorld.dll を参照に追加します。
dotnet add reference ../HelloWorld.dll
4. C# から Java のクラスを呼び出す
Program.cs
using System;
using sample; // Java パッケージ名に対応
class Program
{
static void Main()
{
string msg = HelloWorld.sayHello("C# User");
Console.WriteLine(msg);
}
}
- 実行
dotnet run
出力例:
Hello from Java, C# User!
✅ C# から Java のライブラリを呼び出すことに成功しました!
🔹 補足
package sample; があったので、C# では using sample; が必要になります。
Java 側の public static メソッドは C# 側からそのまま呼び出せます。
複雑な Java ライブラリ(例: Apache Commons, Lucene)も同様に DLL 化できます。
👉 次に、この手順を「逆に C# → Java で呼び出す」例も見てみたいですか?
(例えば、C# 側で DLL を作って Java から呼び出すケース)
はい。
ChatGPT:
いいですね 👍
では、今度は逆に C# の DLL を作成して → Java から呼び出す 例をご紹介します。
こちらは IKVM ではなく、JNI (Java Native Interface) または .NET での COM/CLI 経由を利用するのが一般的です。
ここでは「実際にすぐ試せる」方法として JNI + C# ネイティブライブラリ化 の流れを説明します。
🔹 ステップバイステップ(C# → Java 呼び出し)
- C# でライブラリを作成
まずは .NET で「ネイティブ DLL」を作ります。
(.NET Core でも可能ですが、Windows で一番シンプルに DLL 化できる例を示します)
using System;
using System.Runtime.InteropServices;
public class HelloFromCS
{
[DllExport("SayHello", CallingConvention = CallingConvention.Cdecl)]
public static IntPtr SayHello([MarshalAs(UnmanagedType.LPStr)] string name)
{
string msg = "Hello from C#, " + name + "!";
return Marshal.StringToHGlobalAnsi(msg);
}
}
DLL 作成手順(例:.NET Framework + UnmanagedExports)
DllExport
などのツールを使って C# から直接ネイティブ DLL を生成可能。
ビルドすると HelloFromCS.dll が生成されます。
2. Java から JNI 経由で呼び出す
次に Java 側でネイティブライブラリをロードします。
public class HelloTest {
// C# 側で公開した関数を JNI 経由で宣言
public native String SayHello(String name);
static {
System.loadLibrary("HelloFromCS"); // HelloFromCS.dll をロード
}
public static void main(String[] args) {
HelloTest test = new HelloTest();
String result = test.SayHello("Java User");
System.out.println(result);
}
}
- 実行
HelloFromCS.dll を PATH または java -Djava.library.path=... に置く
Java を実行
javac HelloTest.java
java HelloTest
出力例:
Hello from C#, Java User!
🔹 補足
C# 側を「ネイティブ DLL」としてエクスポートすれば、Java から JNI で利用可能。
クロスプラットフォームでやるなら .NET 6+ で NativeAOT を使い → so/dylib を作り → Java からロードする方法も現実的です。
ただし、逆方向(Java → C#)は IKVM の方が楽、C# → Java は JNI + DLLExport の方が主流 という住み分けがあります。
✅ まとめ
Java → C# 呼び出し → IKVM が簡単。
C# → Java 呼び出し → JNI + DLLExport / NativeAOT が現実的。
双方向を楽にしたいなら JNBridge(商用) を検討。
👉 ここからさらに深掘りするとしたら、
クロスプラットフォーム(Linux/macOS 含む)での NativeAOT 版手順
双方向通信を gRPC で抽象化する方法
どちらを解説したほうがよいですか?
クロスプラットフォーム(Linux/macOS 含む)での NativeAOT 版手順
ChatGPT:
素晴らしい選択です 👍
Windows 固有の DllExport に依存せず、.NET 6+ の NativeAOT を使えば、C# を「本物のネイティブライブラリ(.so / .dylib / .dll)」にコンパイルでき、Linux/macOS/Windows から Java (JNI) で呼び出せます。
以下に クロスプラットフォーム手順をまとめます。
🔹 C# を NativeAOT でネイティブライブラリ化 → Java から呼び出す
- .NET プロジェクトを作成
dotnet new classlib -n HelloAOT
cd HelloAOT
Hello.cs を編集:
using System;
using System.Runtime.InteropServices;
public static class Hello
{
// エクスポートする関数
[UnmanagedCallersOnly(EntryPoint = "say_hello")]
public static IntPtr SayHello(IntPtr namePtr)
{
string name = Marshal.PtrToStringAnsi(namePtr)!;
string msg = $"Hello from C# NativeAOT, {name}!";
return Marshal.StringToHGlobalAnsi(msg);
}
}
- NativeAOT 設定を追加
HelloAOT.csproj に以下を追記:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- NativeAOT 有効化 -->
<PublishAot>true</PublishAot>
<StripSymbols>true</StripSymbols>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.DotNet.ILCompiler" Version="8.*" />
</ItemGroup>
</Project>
- ネイティブライブラリをビルド
Linux/macOS の場合
dotnet publish -r linux-x64 -c Release
出力: bin/Release/net8.0/linux-x64/publish/HelloAOT.so
macOS の場合
dotnet publish -r osx-x64 -c Release
出力: HelloAOT.dylib
Windows の場合
dotnet publish -r win-x64 -c Release
出力: HelloAOT.dll- Java 側で JNI 経由呼び出し
HelloTest.java
public class HelloTest {
static {
// OSに応じてロード
System.loadLibrary("HelloAOT");
// Linux: libHelloAOT.so
// macOS: libHelloAOT.dylib
// Windows: HelloAOT.dll
}
// C# 側でエクスポートした関数を宣言
private static native String say_hello(String name);
public static void main(String[] args) {
String result = say_hello("Java User");
System.out.println(result);
}
}
- 実行
javac HelloTest.java
java -Djava.library.path=./ HelloTest
出力例:
Hello from C# NativeAOT, Java User!
🔹 ポイント
クロスプラットフォーム対応 → .NET 6+ NativeAOT は Linux/macOS/Windows 全部で動く
高速 & 依存最小限 → ランタイム不要のネイティブライブラリを生成できる
Java から JNI 経由で呼べる → C の関数のように扱えるのでシンプル
✅ まとめ
Java → C# → IKVM が便利
C# → Java → NativeAOT + JNI でクロスプラットフォーム可能
双方向を「完全に透明」にしたいなら gRPC / Protobuf で抽象化がおすすめ
👉 ご希望なら、次は gRPC を使って C# ↔ Java を完全対等に通信させるサンプル をお見せできますが、興味ありますか?
はい。
ChatGPT:
Network connection lost. Attempting to reconnect…
参照
ChatGPT利用の技4つ with ChatGPT
https://qiita.com/kaizen_nagoya/items/4a178bd6a09a4a471a7f
ChatGPTによるQiita記事の改良と補足
https://qiita.com/kaizen_nagoya/items/20604d6dd0702ab95c2f
ChatGPTによるQiita記事の改良と補足(2)
https://qiita.com/kaizen_nagoya/items/996275307ffc8c1243f8
本から始める 面倒なことはChatGPTにやらせよう by からあげ
https://qiita.com/kaizen_nagoya/items/f5ce2a18db54b5610e4b
MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら
https://qiita.com/kaizen_nagoya/items/54b648c838fae8d57e38
【松尾研LLMコミュニティ】面倒なことはLLMにやらせよう "Beginning LLM"2024年10月17日 AI(9)
https://qiita.com/kaizen_nagoya/items/efdc23fbe67cdae2126e
設計:ChatGPTで特異解か一般解を求める AI(1)
https://qiita.com/kaizen_nagoya/items/4dec580e16a7c84b0ec4
みんなの使い方から学ぶ
https://qiita.com/kaizen_nagoya/items/8e7de492d896df94a36e
AI・機械学習 昨日、今日、明日
https://qiita.com/kaizen_nagoya/items/adb184c8fc7a65ac9756
DNA LLM and genome for survey 2200 papers by name.
https://qiita.com/kaizen_nagoya/items/ce8a28d6072f340a9d59
ChatGPTから学ぶ 3倍褒めて3分の1貶す
https://qiita.com/kaizen_nagoya/items/91e70fd8caa25076718b
AI時代の相棒は、キミに決めた! 推しのAIエージェントをシェアしよう!企画参加まとめへの序章
https://qiita.com/kaizen_nagoya/items/e3fd7557bac97d1b88f2
記事投稿数、いいね数の目標設定して ChatGPTに聞いてみた。
https://qiita.com/kaizen_nagoya/items/019e2ad9c3e45e45854e
AI時代の相棒は、キミに決めた! ChatGPT推し ver.0
https://qiita.com/kaizen_nagoya/items/8068a884fb2e64cd3c4f
無料ChatGPTの処理限界
https://qiita.com/kaizen_nagoya/items/84683aee26d9f4a28af0
by ChatGPT, with ChatGPT and people opinions.
https://qiita.com/kaizen_nagoya/items/57f00f9b48b25bc231e6
ChatGPTの使い方の利点と課題 by ChatGPT
https://qiita.com/kaizen_nagoya/items/0f469e473a6ed0407daa
DataRobot 風 AI agent Robotをあなたに
https://qiita.com/kaizen_nagoya/items/1ca8ca1dedefaf739d16
ChatGPTの賢い使い方
https://qiita.com/kaizen_nagoya/items/3a7e4583553543eeeeb3
ChatGPTの弱みをあなたに
https://qiita.com/kaizen_nagoya/items/3c97c63a22939e203905
ChatGPTで裸の王様
https://qiita.com/kaizen_nagoya/items/8377be38d3a763e93811
設計 仕様 制約 AI利用開発の鍵 by ChatGPT
https://qiita.com/kaizen_nagoya/items/1b9cb2f9d26308d84791
PowerPoint 筋書き(outline), 見直し(review), 見栄え加工 by ChatGPT
https://qiita.com/kaizen_nagoya/items/37bb97fc250fca37295b
逃げ回るChatGPTを追い詰めるには
https://qiita.com/kaizen_nagoya/items/cd60426e626ba05e0377
三人寄れば文珠の知恵は直交する能力前提 by ChatGPT
https://qiita.com/kaizen_nagoya/items/512e5611615e2426bb42
プログラマ3年で社長事業(未成年編) 博士論文支援追加
https://qiita.com/kaizen_nagoya/items/326452b5bf29c144c307
自殺防止手引き原稿 補足 by ChatGPT
https://qiita.com/kaizen_nagoya/items/7e459fa7edf7205c2667
しつけ(discipline) の測定視点 by ChatGPT
https://qiita.com/kaizen_nagoya/items/6b5ce03c545f7bbd8723
技術者は英語を学ぶ必要はない。英単語の羅列でいい=プログラム。
https://qiita.com/kaizen_nagoya/items/4fc3963a21e0339fd1c9
猫中心設計から鳥中心設計へ part2
https://qiita.com/kaizen_nagoya/items/4d7a5a33c85e0b01dc5d
プログラマ必須科目 ChatGPTにも確認
https://qiita.com/kaizen_nagoya/items/7b30d9d119792130facd
なんで音楽とプログラムの関係がうまく書けないか。
https://qiita.com/kaizen_nagoya/items/489a68d360df4b26f87d
AI利用業務手引き
https://qiita.com/kaizen_nagoya/items/f201b292f37dba16e9ef
C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1
C言語(C++)が必要な人、必要ない人 ChatGPT
https://qiita.com/kaizen_nagoya/items/a074cb8cd292d8d94bd4
C言語を習得する3つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b
C言語を習得する3つの方法 ChatGPT
https://qiita.com/kaizen_nagoya/items/4a3518a18fa49f46787f