Hallo, ich bin ein absoluter JSL-Anfänger und versuche, eine JMP-Anwendung für unser Team zu erstellen.
Dazu wurde mir klar, dass ich die C#-DLL in die JSL laden und von dort aus eine Funktion aufrufen muss.
Ich habe den Teil der DLLs im JMP-Skripthandbuch gelesen, bin mir aber nicht sicher, ob dies auf die .NET-DLL angewendet werden kann.
Hat jemand Erfahrung mit dem Laden einer .NET-DLL und dem Aufrufen einer Funktion von dort in der JSL?
Hallo @ejesjh , ich werde versuchen, dir hier weiterzuhelfen.
Das Erste, was Sie wissen sollten, ist, dass der Aufruf von JMP in eine .NET-DLL (Assembly) etwas schwieriger ist als der Aufruf in native DLLs, da .NET-Assemblys ihre Einstiegspunkte normalerweise nicht exportieren.
Intern verwendet JMP die GetProcAddress Windows-API zum Suchen von aufzurufenden Funktionen. Der Schlüssel zum JMP-Aufruf in Ihrem Code liegt also darin, dass der Einstiegspunkt ordnungsgemäß exportiert wird.
Ich kann zwei mögliche Ansätze empfehlen, die Sie zum Aufrufen von JMP in eine .NET-Assembly verwenden können:
1. Verwenden Sie eines der öffentlich verfügbaren Nuget-Pakete, die das Markieren von Methoden zum Exportieren ermöglichen. Ein solches Paket ist DllExport ( https://github.com/3F/DllExport ) Die Verwendung dieses bestimmten Pakets erfordert etwas zusätzliche Arbeit, da dadurch Ihre csproj-Datei geändert wird, um den erforderlichen Code zum Aktivieren eines [DllExport]-Attributs hinzuzufügen.
Um diesen Ansatz zu testen, habe ich eine WinForms-Klassenbibliothek (.NET Framework) erstellt. Zuerst musste ich eine erstellen x64 Konfiguration als Standard Jede CPU config generiert keine 64-Bit-DLL. Dann habe ich die mit diesem Paket bereitgestellte Batchdatei verwendet, um die DllExport-Maschinerie hinzuzufügen. Dann habe ich eine Methode exportiert:
public static class MyExportedClass
{
[DllExport("MyMethod")]
public static void MyMethod()
{
MessageBox.Show("Called into MyMethod");
}
}
Ich habe die Assembly erstellt und schließlich die folgende JSL verwendet, um sie aufzurufen.
myDLL = LoadDLL("C:\MyLibrary\bin\x64\Debug\MyLibrary.dll");
myDLL << Declare Function( "MyMethod" );
myDLL << MyMethod();
2. Die andere Option, die ich empfehlen kann, ist die Erstellung einer C++-DLL, die als Vermittler zwischen JMP und Ihrem C#-Code fungiert. Die DLL würde Funktionen exportieren, die JMP aufrufen kann, und innerhalb der DLL würden Sie Ihren C#-Code aufrufen. Damit C++-Code C# aufrufen kann, verwenden Sie die C++/CLI-Sprachfunktion. Das bedeutet, dass der C++-Code mit der Option /clr erstellt wird und auf .NET-Assemblys verweist. Sie würden einen Verweis auf Ihre C#-Assembly hinzufügen und Aufrufe in Ihrem C#-Code durchführen.
Um in diese Richtung zu beginnen, würde ich Visual Studio verwenden und ein neues Projekt mit erstellen CLR-Klassenbibliothek (.NET Framework) Vorlage. Wenn Sie bei diesem Ansatz nicht weiterkommen, posten Sie, was Sie versucht haben, und vielleicht kann ich Ihnen weitere Anleitungen geben.
Hoffe das hilft,
John