Bonjour, je suis très débutant en JSL et j'essaie de créer une application JMP pour notre équipe.
Pour ce faire, j'ai réalisé que je devais charger la dll c# dans le JSL et appeler une fonction à partir de là.
J'ai lu la partie des DLL dans le guide de script JMP mais je ne suis pas sûr que cela puisse être appliqué à la DLL .NET.
Quelqu'un a-t-il déjà chargé une DLL .NET et appelé une fonction à partir de là dans le JSL ?
Salut @ejesjh , je vais essayer de vous aider ici.
La première chose à savoir est que l'appel depuis JMP vers une DLL (Assembly) .NET est un peu plus délicat que l'appel vers des DLL natives car les assemblys .NET n'exportent normalement pas leurs points d'entrée.
En interne, JMP utilise le ObtenirProcAddress API Windows pour localiser les fonctions à appeler. Ainsi, la clé pour que JMP appelle votre code est d’exporter correctement le point d’entrée.
Je peux recommander deux approches possibles que vous pouvez utiliser pour appeler depuis JMP dans un assembly .NET :
1. Utilisez l'un des packages Nuget accessibles au public qui permettent de marquer les méthodes afin qu'elles soient exportées. Un de ces packages est DllExport ( https://github.com/3F/DllExport ) L'utilisation de ce package particulier nécessite un peu de travail supplémentaire car il modifiera votre fichier csproj pour ajouter le code nécessaire pour activer un attribut [DllExport].
Pour tester cette approche, j'ai créé une bibliothèque de classes WinForms (.NET Framework). J'ai d'abord dû créer un x64 configuration par défaut N'importe quel CPU config ne génère pas de DLL 64 bits. Ensuite, j'ai utilisé le fichier batch fourni avec ce package pour ajouter la machinerie DllExport. Ensuite, j'ai exporté une méthode :
public static class MyExportedClass
{
[DllExport("MyMethod")]
public static void MyMethod()
{
MessageBox.Show("Called into MyMethod");
}
}
J'ai construit l'assembly et finalement utilisé le JSL suivant pour l'appeler.
myDLL = LoadDLL("C:\MyLibrary\bin\x64\Debug\MyLibrary.dll");
myDLL << Declare Function( "MyMethod" );
myDLL << MyMethod();
2. L'autre option que je peux recommander est de créer une DLL C++ qui est un intermédiaire entre JMP et votre code C#. La DLL exporterait des fonctions que JMP appellerait et dans la DLL, vous appelleriez votre code C#. Pour permettre au code C++ d’appeler en C#, vous utilisez la fonctionnalité du langage C++/CLI. Cela signifie que le code C++ est construit avec l’option /clr et fait référence aux assemblys .NET. Vous ajouteriez une référence à votre assembly C# et effectueriez des appels dans votre code C#.
Pour commencer dans cette direction, j'utiliserais Visual Studio et créerais un nouveau projet en utilisant le Bibliothèque de classes CLR (.NET Framework) modèle. Si vous restez bloqué sur cette approche, publiez ce que vous avez essayé et je pourrai peut-être vous offrir plus de conseils.
J'espère que cela t'aides,
John