0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JAVA と C# 共通ライブラリ with ChatGPT

Last updated at Posted at 2025-09-30

JAVA と C# 共通ライブラリが作れないか相談。

ChatGPTの質疑はそのまま。誤植があってそれなりに応えてくれる場合と、
誤植がなくても、違う意味に捉えてしまうこともあります。
どちらも記録として保存しています。

CHatGPT

C#とJAAVの共通ライブラリはありますか?

ChatGPT:

いいご質問です。
結論から言うと、C#(.NET系)と Java の両方で「完全に共通のライブラリ」というものは基本的に存在しません。なぜなら、C# は .NET CLR、Java は JVM という別々の仮想マシン上で動作するため、バイナリ互換性がないからです。
ただし、両者で「共通に利用できる」または「移植が比較的容易」な仕組みやライブラリ群はいくつか存在します。

  1. 仕様レベルで共通するライブラリ
    標準ライブラリに似た設計
    Java の java.util.* と .NET の System.Collections.* はデータ構造やコレクションの思想が似ています。
    スレッドや並行処理に関しても java.util.concurrent と .NET の System.Threading.Tasks は役割が近いです。
  2. 移植性のあるライブラリ/フレームワーク
    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 アプリ基盤は共通化しやすい。
  3. クロスプラットフォームで両者を橋渡しする技術
    IKVM.NET
    → Java バイトコードを .NET 上で動かせる(ただしメンテナンス停滞中)。
    JNI + C++/CLI 経由
    → C++ を介して共通のネイティブライブラリを呼び出す方法。
    WebAssembly (WASM)
    → 将来的には、C# も Java も WASM にコンパイルして「共通実行環境」を使える可能性がある。
    ✅ まとめ
    「共通のバイナリをそのまま両者で使う」ものは基本的に 存在しない。
    しかし gRPC / Protobuf / JSON / XML / log4x 系 のような「言語非依存仕様」に基づいたライブラリは両方で使える。
    相互運用する場合は IDL やデータフォーマットレベルで共通化するのが現実的。
    ご希望に合わせて、
    🔹「両者でそのまま使えるクロスコンパイル環境」
    🔹「概念的に対応している標準ライブラリ比較表」
    のどちらかを詳しく整理できますが、どちらをご覧になりたいですか?

両者でそのまま使えるクロスコンパイル環境

ChatGPT:

なるほど!
「C# (.NET) と Java (JVM) の両方で そのまま使えるクロスコンパイル環境」という観点で整理しますね。

  1. バイトコード変換型(Java ⇔ .NET)
    IKVM.NET
    Java バイトコード(.jar)を .NET のアセンブリ(.dll/.exe)に変換するツールチェーン。
    JVM ランタイムを .NET 上に移植しており、Java ライブラリをそのまま C# から呼び出せる。
    一時期は活発だったが、公式の開発は停滞気味。フォーク版(IKVM 8, IKVM 9)がコミュニティで更新中。
    JNBridge(商用)
    Java と .NET の相互運用を可能にするブリッジ製品。
    変換というより「双方向に呼び出し可能」にする仕組み。
  2. 共通中間表現を使うタイプ
    WebAssembly (WASM)
    C#(Blazor / .NET 8+)も Java(TeaVM, CheerpJ など)も WASM にコンパイル可能。
    ブラウザや WASI ランタイム上で両方が動く → 共通バイナリ形式。
    まだ「業務アプリ全般を共通化」という段階には至っていないが、将来性あり。
    LLVM 中間表現 (LLVM IR)
    Java バイトコードを LLVM に変換(例: VMKit, GraalVM の一部機能)。
    C# も .NET Core で LLVM バックエンドを使える実験的プロジェクトあり。
    研究寄りで実用は限定的。
  3. クロス言語コード生成
    IDL(インタフェース定義言語)を介す方式
    gRPC / Protocol Buffers / Thrift / Avro
    一つの定義ファイル(.proto など)から C# と Java 両方のコードを自動生成。
    これは「共通ライブラリのクロスコンパイル」ではなく「共通コードの自動生成」に近い。
    高い実用性があり、マイクロサービスや分散システムで標準的。
  4. 旧来の試み
    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#で使う)

  1. IKVM を入手
    IKVM のオリジナル開発は終了しましたが、フォークが維持されています。
    IKVM 8 / 11 (フォーク)
    .NET 6/7/8 に対応するビルドあり。
    Windows / Linux / macOS で動作可。
    インストール例(Windows / Linux 共通)
    dotnet tool install --global IKVM.Maven.Sdk
    または GitHub Release から ikvmc やランタイムをダウンロードして展開。
  2. 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 が生成されます。
  3. 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# から利用できます。

  1. 注意点
    対応 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# から呼び出す までを一式サンプルでご紹介します。
🔹 ステップバイステップ手順

  1. 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);
    }
}
  1. 実行
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 呼び出し)

  1. C# でライブラリを作成
    まずは .NET で「ネイティブ DLL」を作ります。
    (.NET Core でも可能ですが、Windows で一番シンプルに DLL 化できる例を示します)
HelloFromCS.cs
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 側でネイティブライブラリをロードします。

HelloTest.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);
    }
}
  1. 実行
    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 から呼び出す

  1. .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);
    }
}
  1. 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>
  1. ネイティブライブラリをビルド
    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
  2. 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);
    }
}
  1. 実行
    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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?