您好,我是 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)模板。 如果您陷入这种方法,请发布您尝试过的内容,也许我可以提供更多指导。
希望这可以帮助,
约翰