您好,我是 JSL 的初學者,正在嘗試為我們的團隊建立 JMP 應用程式。
為此,我意識到必須將 c# dll 載入到 JSL 並從那裡呼叫函數。
我已閱讀 JMP 腳本指南中的 DLL 部分,但我不太確定這是否可以應用於 .NET dll。
有人有載入 .NET dll 並在 JSL 中呼叫函數的經驗嗎?
你好@ejesjh ,我會盡力幫助你。
首先要知道的是,從 JMP 呼叫 .NET DLL(組件)比呼叫本機 DLL 有點棘手,因為 .NET 組件通常不會匯出其入口點。
在內部,JMP 使用取得進程地址用於定位要呼叫的函數的 Windows API。 因此,讓 JMP 呼叫程式碼的關鍵是正確匯出入口點。
我可以推薦兩種可能的方法,您可以使用它們從 JMP 呼叫 .NET 組件:
1. 使用公開可用的 Nuget 套件之一,該套件允許標記方法以便匯出它們。 DllExport 就是這樣的一個套件( https://github.com/3F/DllExport )使用該特定套件需要一些額外的工作,因為它將修改您的 csproj 檔案以添加必要的程式碼以啟用 [DllExport] 屬性。
為了測試這個方法,我建立了一個 WinForms (.NET Framework) 類別庫。 首先我必須創建一個x64配置為預設任意CPU config 不會產生 64 位元 DLL。 然後,我使用該套件提供的批次檔來新增 DllExport 機器。 然後,我匯出了一個方法:
public static class MyExportedClass
{
[DllExport("MyMethod")]
public static void MyMethod()
{
MessageBox.Show("Called into MyMethod");
}
}
我建立了程序集並最終使用以下 JSL 來呼叫它。
myDLL = LoadDLL("C:\MyLibrary\bin\x64\Debug\MyLibrary.dll");
myDLL << Declare Function( "MyMethod" );
myDLL << MyMethod();
2. 我推薦的另一個選項是建立一個 C++ DLL,它是 JMP 和 C# 程式碼之間的中介。 DLL 將匯出供 JMP 呼叫的函數,並且在 DLL 中,您將呼叫 C# 程式碼。 若要允許 C++ 程式碼呼叫 C#,您可以使用 C++/CLI 語言功能。 這意味著 C++ 程式碼是使用 /clr 選項建立的並引用 .NET 組件。 您可以新增對 C# 組件的參考並對 C# 程式碼進行呼叫。
為了朝這個方向開始,我將使用 Visual Studio 並使用以下命令建立新項目CLR 類別庫(.NET Framework)模板。 如果您陷入這種方法,請發布您嘗試過的內容,也許我可以提供更多指導。
希望這可以幫助,
約翰