こんにちは、私は JSL の初心者で、チームのために JMP アプリケーションを作成しようとしています。
これを行うには、C# dll を JSL にロードし、そこから関数を呼び出す必要があることに気付きました。
JMP スクリプト ガイドの DLL の部分を読みましたが、これが .NET DLL に適用できるかどうかはわかりません。
.NET DLLをロードして、そこからJSLで関数を呼び出した経験のある人はいますか?
こんにちは@ejesjh , ここでお手伝いさせていただきます。
まず知っておくべきことは、JMP から .NET DLL (アセンブリ) を呼び出すのは、ネイティブ DLL を呼び出すよりも少し難しいということです。これは、.NET アセンブリは通常、そのエントリ ポイントをエクスポートしないためです。
JMP は内部的に、 GetProcAddress呼び出す関数を見つけるための Windows API。 したがって、JMP をコードに呼び出すための鍵は、エントリ ポイントを適切にエクスポートすることです。
JMP から .NET アセンブリを呼び出すために使用できる 2 つのアプローチをお勧めします。
1. メソッドをエクスポートできるようにマーク付けできる、公開されている Nuget パッケージの 1 つを使用します。 そのようなパッケージの 1 つが 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. 私がお勧めできるもう 1 つのオプションは、JMP と C# コードの間の仲介となる C++ DLL を作成することです。 DLL は JMP が呼び出す関数をエクスポートし、DLL 内で C# コードを呼び出します。 C++ コードから C# を呼び出せるようにするには、C++/CLI 言語機能を使用します。 これは、C++ コードが /clr オプションを使用してビルドされ、.NET アセンブリを参照することを意味します。 C# アセンブリへの参照を追加し、C# コードを呼び出します。
この方向に進むには、Visual Studio を使用し、次のコマンドを使用して新しいプロジェクトを作成します。 CLR クラス ライブラリ (.NET Framework)テンプレート。 このアプローチで行き詰まった場合は、試したことを投稿していただければ、さらに詳しいガイダンスを提供できるかもしれません。
お役に立てれば、
ジョン