MASES.JCOReflectorEngine 1.11.0

.NET 6.0 .NET Core 3.1 .NET Framework 4.6.2
dotnet add package MASES.JCOReflectorEngine --version 1.11.0
NuGet\Install-Package MASES.JCOReflectorEngine -Version 1.11.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MASES.JCOReflectorEngine" Version="1.11.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add MASES.JCOReflectorEngine --version 1.11.0
#r "nuget: MASES.JCOReflectorEngine, 1.11.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install MASES.JCOReflectorEngine as a Cake Addin
#addin nuget:?package=MASES.JCOReflectorEngine&version=1.11.0

// Install MASES.JCOReflectorEngine as a Cake Tool
#tool nuget:?package=MASES.JCOReflectorEngine&version=1.11.0

JCOReflector (a .NET Java wrapper)

CI_WINDOWS CI_LINUX CI_DOCS CI_MAVEN CI_RELEASE

.NET Framework .NET 5 .NET 6
Maven Central Maven Central Maven Central
JCOReflectorEngine JCOReflectorCLI
latest version downloads latest version downloads

The project

JCOReflectorEngine produces a set of .NET wrapper for Java as JARs that are available for download. It's simple to use: you only need to reference JCOReflector.jar in the class-path and use the .NET API within your Java projects like exposed in the example section.

The core of the project is the innovative JCOReflector, a reflection engine which automatically writes Java classes using .NET class reflection. JCOReflector can be used to reflects any .NET assembly (even assembly outside the Microsoft ones) into JARs. The generated wrapper classes are based on the powerful JCOBridge engine and extends its use to simplify the use of .NET from Java(JVM). It was created internally from us to support our customers, now we made it available for everyone.

This project adheres to the Contributor Covenant code of conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to coc_reporting@masesgroup.com.

Runtime engine

JCOReflector uses JCOBridge, and its features, to obtain many benefits:

  • Cyber-security:
    • JVM and CLR, or CoreCLR, runs in the same process, but are insulated from each other;
    • JCOBridge does not make any code injection into CLR or JVM;
    • JCOBridge does not use any other communication mechanism than JNI;
    • JVM inherently inherits the cyber-security levels of running .NET (CLR);
  • Direct access the CLR from any JVM application:
    • No need to learn new APIs: we try to expose the same .NET APIs in Java style;
    • No extra validation cycle: bug fix, improvements, new features are immediately available;
    • Documentation is shared.

Have a look at the following resources:

History of the project

This project started in 2019 with the aims to create a set of Java (JVM) classes which mimic .NET (Framework/Core) conterparts, in May 2020 the first commit in GitHub. Using this project it is possible to use .NET API in Java and all JVM enabled languages (Scala, Kotlin, and so on). The final output of JCOReflector are JARs. At its first stages no JARs was available: only the JCOBridge engine, the graphical UI that helps to manages reflection and the operations needed to finally build JARs was relased. Starting from recent relases automated continous integration and verification process are in places, so the produced JARs are directly available for download and is no more needed to manually rebuils JARs before use it. Anyway still possible to use JCOReflector to reflects any .NET assembly (even assembly outside the Microsoft ones) into JARs, and because JCOReflector uses templates it is not necessary to manually manages the output, special needs can be addressed dirctly inside the templates.

Simple example


package mscorlib;

import system.*;
import system.io.*;

public class HelloNET {
    public static void main(String[] args) {
        try {
            String filename = "test.txt";
            String result = "";
            if (File.Exists(filename)) {
                result = File.ReadAllText(filename);
				Console.WriteLine(result);
                result = result + "Java Execution ";
                File.WriteAllText(filename, result);
            }
            Console.WriteLine(result);
            Console.WriteLine("Exiting");
        } catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        } catch (Throwable tre) {
            tre.printStackTrace();
        }
        return;
    }
}

This is the result:

prompt> This is a text file for read/write operation
prompt> This is a text file for read/write operation Java Execution
prompt> Exiting

To run it runs a command like the following one:

java -cp JCOReflector.jar;. HelloNET

The full example code, and other ones, are in the project test folder.

A basic Scala examples is the following one:

package mscorlib

import system.Console
import system.Environment

object HelloIterator {
  def main(args: scala.Array[String]): Unit = {
    try {
      Environment.GetLogicalDrives.foreach(Console.WriteLine(_))
      Environment.Exit(0)
    } catch {
      case tre: Throwable =>
        tre.printStackTrace()
    }
  }
}

the same example written in Kotlin is the following one:

package mscorlib

import system.Console
import system.Environment

object HelloIterator {
    @JvmStatic
    fun main(args: Array<String>) {
        try {
            for (drive in Environment.GetLogicalDrives()) {
                Console.WriteLine(drive)
            }
            Environment.Exit(0)
        } catch (tre: Throwable) {
            tre.printStackTrace()
        }
    }
}

Whats in .NET for Java?

From the point of view of .NET it is very simple to use Java classes and it is not necessary to have some kind of reflection classes:

  1. JCOBridge is able to access and execute directly within a JVM using C# code, from C# it is possible to execute directly Java code with a similar syntax: look at the examples in JCOBridge-Examples.
  2. The project JNet uses JCOBridge: a developer has some ready made Java classes to be used from .NET.

Actual state

The JCOBridge is a mature platform for .NET assembly reflection, the .NET wrapper JARs are available and cover most of the .NET framework functionality.
The reflector executables, available for both Framework and CoreCLR, is limited in the following features:

Implemented in the reflector

  • Only public Types are available
  • Classes and public accessible methods
  • Interface
  • Enum: enumeration and flags are available
  • .NET exception are translated and thrown in code
  • Static classes are managed
  • Events
  • Arrays: partial support
  • Inheritance
  • Out/Ref parameters
  • Native types managed from JCOBridge are directly mapped to native Java type
  • Base types (System.Object, System.Type, System.Enum, System.Exception, System.Collections.ArrayList) are mapped to specific type into a support library (JCOReflector.jar)
  • Management of thrown declaration as expected in Java: a generic Throwable is used with all exceptions found in code (used the algorithm in https://stackoverflow.com/questions/986180/how-can-i-determine-which-exceptions-can-be-thrown-by-a-given-method and code from https://docs.microsoft.com/en-us/archive/blogs/haibo_luo/)
  • Documentation

Not implemented in reflector:

  • Generic types
  • Method decoration (Attributes)
  • Unsafe methods
  • Fields

Limitations

C# and Java are different languages. The reflection process cannot reflects into Java some features available on C#: an example are properties where get/set is automatically choosed from C# compiler Other limitations comes from some differences between the two engines (CLR and JVM). In all cases JCOBridge superside these limitations, but manual operations shall be made: do not change the reflected classes, override them in your code.

How to use the generator tool (JCOReflector)

In the root folder execute:

dotnet build JCOReflector\JCOReflector.sln

or

dotnet build JCOReflector\JCOReflectorCLI.sln

Within the folder bin you will find three subfolders:

  • net462 (available only on Windows platform)
  • netcoreapp3.1 (available on .NET Core supported platforms)
  • net5.0 (available on .NET 5 supported platforms)
  • net6.0 (available on .NET 6 supported platforms)

in each subfolder will be available two executables:

  • JCOReflectorCLI the CLI tool;
  • JCOReflectorGUI the GUI tool, below some screenshot:

JCOReflector JCOReflector

Reflected Assemblies

The folder netreflected contains all reflected classes generated for .NET Framework (net462), Core (netcoreapp3.1), 5 (net5.0) and 6 (net6.0). Below the coverage statistics and the list of analyzed and reflected assemblies:

Statistics

FrameworkStatistic

FrameworkStatisticPercent

NetcoreStatistic

NetcoreStatisticPercent

Net5Statistic

Net5StatisticPercent

Net6Statistic

Net6StatisticPercent

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows net7.0 net7.0-android net7.0-ios net7.0-maccatalyst net7.0-macos net7.0-tvos net7.0-windows
.NET Core netcoreapp3.1
.NET Framework net462 net463 net47 net471 net472 net48
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on MASES.JCOReflectorEngine:

Package Downloads
MASES.NuReflector

NuReflector - a reflector engine for NuGet packages

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.11.0 261 8/18/2022
1.10.1 204 4/6/2022
1.10.0 223 3/30/2022
1.9.3 182 3/15/2022
1.9.2 172 3/14/2022
1.9.1 174 3/11/2022
1.9.0 177 3/10/2022
1.8.6 209 3/4/2022
1.8.5 193 3/2/2022
1.8.4 266 2/25/2022
1.8.3 401 2/7/2022
1.8.2 268 12/31/2021
1.8.1 450 11/22/2021
1.8.0 234 11/15/2021
1.7.3 412 10/19/2021
1.7.1 250 10/11/2021
1.7.0 246 9/1/2021