Llamando al ensamblado .NET desde Java: JVM se bloquea

Tengo un ensamblado .NET de terceros y una gran aplicación Java. Necesito llamar a los mothods proporcionados por la biblioteca de clases .NET desde la aplicación Java. El ensamblaje no está habilitado para COM. He buscado en la red y hasta ahora tengo lo siguiente:

Código C # (cslib.cs):

using System;

namespace CSLib
{
    public class CSClass
    {
        public static void SayHi()
        {
            System.Console.WriteLine("Hi");
        }
    }
}

compilado con (usando .net 3.5, pero lo mismo sucede cuando se usa 2.0):

csc /target:library cslib.cs

Código C ++ (clib.cpp):

#include <jni.h>
#using <CSLib.dll>

using namespace CSLib;

extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
    CSLib::CSClass::SayHi();
}

compilado con (usando las herramientas de VC 2008, pero lo mismo sucede cuando se usan las herramientas de 2003):

cl /clr /LD clib.cpp
mt -manifest clib.dll.manifest -outputresource:clib.dll;2

Código Java (CallCS.java):

class CallCS {
    static {
       System.loadLibrary("clib");
    }
    private static native void callCS();
    public static void main(String[] args) {
        callCS();
    }
}

Cuando intento ejecutar la clase java, la máquina virtual Java se bloquea al invocar el método (puede cargar la biblioteca):

#
# An unexpected error has been detected by Java Runtime Environment:
#
#  Internal Error (0xe0434f4d), pid=3144, tid=3484
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [kernel32.dll+0x22366]
#
...
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  CallCS.callCS()V+0
j  CallCS.main([Ljava/lang/String;)V+0
v  ~StubRoutines::call_stub

Sin embargo, si creo una aplicación cpp simple que carga clib.dll y llama a la función exportada Java_CallCS_callCS, todo está bien. He intentado esto en entornos x86 y x64 y el resultado es el mismo. No he probado otras versiones de Java, pero necesito el código para ejecutarse en 1.5.0.

Además, si modifico clib.cpp para llamar solo a los métodos del sistema, todo funciona bien incluso desde Java:

#include <jni.h>
#using <mscorlib.dll>

using namespace System;

extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
    System::Console::WriteLine("It works");
}

Para concluir:

Soy capaz de llamar a los métodos del sistema desde Java -> clib.dll -> mscorlib.dllSoy capaz de llamar a cualquier método desde CPPApp -> clib.dll -> cslib.dllNo puedo llamar a ningún método desde Java -> clib.dll -> cslib.dll

Soy consciente de una solución alternativa que utiliza 1. anterior: puedo usar la reflexión para cargar de manera ensamblada e invocar los métodos deseados utilizando solo las llamadas al sistema, pero el código se complica y espero una mejor solución.

Sé sobre el proyecto dotnetfromjava, que utiliza el método de reflexión, pero prefiero no agregar más complejidad de la necesaria. Usaré algo como esto si no hay otra manera, sin embargo.

También he mirado en ikvm.net, pero entiendo que usa su propia JVM (escrita en C #) para hacer la magia. Sin embargo, ejecutar la aplicación Java completa bajo su VM no es una opción para mí.

Gracias.

Respuestas a la pregunta(4)

Su respuesta a la pregunta