Ciao, sono un principiante di JSL e sto cercando di creare un'applicazione JMP per il nostro team.
Per fare ciò, mi sono reso conto che dovevo caricare c# dll nel JSL e chiamare una funzione da lì.
Ho letto la parte delle DLL nella guida allo scripting JMP ma non sono così sicuro che possa essere applicato per .NET dll.
Qualcuno ha esperienza nel caricamento di .NET dll e nella chiamata di una funzione da lì nel JSL?
CIAO @ejesjh , Cercherò di aiutarti qui.
La prima cosa da sapere è che chiamare da JMP in una DLL (assembly) .NET è un po' più complicato che chiamare in DLL native perché gli assembly .NET normalmente non esportano i propri punti di ingresso.
Internamente, JMP utilizza il file OttieniIndirizzoProc API di Windows per individuare le funzioni da chiamare. Pertanto, la chiave per far sì che JMP chiami nel tuo codice è esportare correttamente il punto di ingresso.
Posso consigliare due possibili approcci che puoi utilizzare per chiamare da JMP in un assembly .NET:
1. Utilizzare uno dei pacchetti Nuget disponibili pubblicamente che consentono di contrassegnare i metodi in modo che vengano esportati. Uno di questi pacchetti è DllExport ( https://github.com/3F/DllExport ) L'utilizzo di quel particolare pacchetto richiede un po' di lavoro extra poiché modificherà il file csproj per aggiungere il codice necessario per abilitare un attributo [DllExport].
Per testare questo approccio, ho creato una libreria di classi WinForms (.NET Framework). Per prima cosa ho dovuto creare un file x64 configurazione come predefinita Qualsiasi CPU config non genera una DLL a 64 bit. Quindi, ho utilizzato il file batch fornito con il pacchetto per aggiungere il macchinario DllExport. Quindi, ho esportato un metodo:
public static class MyExportedClass
{
[DllExport("MyMethod")]
public static void MyMethod()
{
MessageBox.Show("Called into MyMethod");
}
}
Ho creato l'assembly e infine ho utilizzato il seguente JSL per chiamarlo.
myDLL = LoadDLL("C:\MyLibrary\bin\x64\Debug\MyLibrary.dll");
myDLL << Declare Function( "MyMethod" );
myDLL << MyMethod();
2. L'altra opzione che posso consigliare è creare una DLL C++ che funga da intermediario tra JMP e il codice C#. La DLL esporterebbe le funzioni che JMP può chiamare e all'interno della DLL chiameresti il tuo codice C#. Per consentire al codice C++ di effettuare chiamate in C#, utilizzare la funzionalità del linguaggio C++/CLI. Ciò significa che il codice C++ viene compilato con l'opzione /clr e fa riferimento agli assembly .NET. Dovresti aggiungere un riferimento all'assembly C# ed effettuare chiamate nel codice C#.
Per iniziare in questa direzione, utilizzerei Visual Studio e creerei un nuovo progetto utilizzando il file Libreria di classi CLR (.NET Framework) modello. Se rimani bloccato su questo approccio, pubblica ciò che hai provato e forse posso offrirti ulteriori indicazioni.
Spero che questo ti aiuti,
John