Appeler un 3ème party.NET DLL utilisant JNI


J'essaie d'appeler une DLL.NET 3ème partie (tirée de ici) à partir d'un programme JAVA. Après avoir cherché ici et ici, j'ai réussi à obtenir le tout pour compiler et exécuter. Mais je reçois une exception lors de l'exécution du code. NET:

Erreur Fatale a été détectée par l'Environnement d'Exécution Java

Cela ne se produit que lorsque j'essaie d'accéder à un autre objet et méthode. net à partir de la DLL. NET:

JNIEXPORT void JNICALL Java_test_broadcast
(JNIEnv *, jobject)
{
   // Instantiate the MC++ class.
   IManagedWrapper* t = IManagedWrapper::CreateInstance();

   // The actual call is made. 
   t->Broadcast();
}

void ManagedWrapper::Broadcast(std::string message)
{
   //Uncommenting the following line will raise the error
   //IXDBroadcast^ broadcast = XDBroadcast::CreateBroadcast(XDTransportMode::WindowsMessaging);
}

J'ai réussi à en créer un .NET DLL qui lie au code ci-dessus et fonctionne comme vous le souhaitez.

Comment puis-je appeler les objets et la méthode. NET à partir du code Java?

Author: Eldad, 2012-04-08

2 answers

J'ai suivi le lien @"Aéroglisseur Plein d'Anguilles" dans les commentaires: Appeler des DLL.Net à partir de code Java sans utiliser regasm.exe

J'ai utilisé C++\CLI pour faire le pont entre le code natif et le code géré et cela a fonctionné à merveille. Le problème principal était que ma DLL bridge s'exécute sous JVM, et la DLL que j'ai essayé de charger n'était pas dans le répertoire JRE\bin. Pour résoudre ce problème, j'ai chargé dynamiquement les assemblys. Net à partir du code C++/CLI (basé sur this):

static Assembly^ MyResolveEventHandler( Object^ sender, ResolveEventArgs^ args )
{
    //Retrieve the list of referenced assemblies in an array of AssemblyName.
    Assembly^ MyAssembly;
    Assembly^ objExecutingAssemblies;
    String^ strTempAssmbPath = "";

    objExecutingAssemblies = Assembly::GetExecutingAssembly();
    array<AssemblyName ^>^ arrReferencedAssmbNames = objExecutingAssemblies->GetReferencedAssemblies();

    //Loop through the array of referenced assembly names.
    for each (AssemblyName^ strAssmbName in arrReferencedAssmbNames)
    {
        //Check for the assembly names that have raised the "AssemblyResolve" event.
        if (strAssmbName->FullName->Substring(0, strAssmbName->FullName->IndexOf(",")) == args->Name->Substring(0, args->Name->IndexOf(",")))
        {
            //Build the path of the assembly from where it has to be loaded.                
            strTempAssmbPath = pathBase + args->Name->Substring(0, args->Name->IndexOf(",")) + ".dll";
            break;
        }

    }
    //Load the assembly from the specified path.                    
    MyAssembly = Assembly::LoadFrom(strTempAssmbPath);

    //Return the loaded assembly.
    return MyAssembly;
}
 4
Author: Eldad, 2012-04-09 14:38:59

C'est exactement ce que font les ponts Java vers.NET natifs en arrière-plan.

En fonction de la quantité de code.NET que vous devez utiliser et de la complexité de votre objet. NET (quel type de méthodes vous avez, si vous utilisez des génériques, si vous avez des tableaux, etc...) vous pouvez également envisager d'utiliser un tel pont. Lorsque vous creusez dans un tel cas plus profondément, l'un après l'autre, plus de limitations apparaissent si vous le faites manuellement via C++/CLI vous-même. Si vous avez besoin d'une solution rapide et fiable pour la production environnement que je recommanderais de vérifier:

Chacun de ces ponts couvrira toutes les communications natives pour vous et la livraison interface très facile à utiliser.NET charger toute DLL et même utiliser l'ensemble. NET Framework dans votre application JAVA.

En fonction de vos besoins, Javonet Je pense que c'est le plus facile et le plus léger avec une puissance et une flexibilité énormes, définitivement utile si vous recherchez une solution commerciale fiable avec un bon support et une API facile pour faire avancer les choses en 5min (pour non commercial et académique est gratuit). JNBridge plus havy avec un générateur de classes proxy fortement typé également très puissant et également bon pour un usage commercial, surtout si vous avez besoin de l'un de leurs connecteurs dédiés (affecte le prix mais dépend de vos besoins). JNI4NET beau projet open-source je dirais pour une application non critique et non commerciale mais qui vaut la peine vérifier.

Avec un tel pont, vous ne vous souciez pas de toute implémentation supplémentaire, copiez simplement.NET dll et utilisez-le en JAVA. Vous pouvez le voir ici: http://www.youtube.com/watch?v=n6XfzrHTdK4

 1
Author: Przemysław Ładyński, 2013-11-07 21:48:10