안녕하세요. 저는 JSL 초보이고 우리 팀을 위한 JMP 애플리케이션을 만들려고 합니다.
이렇게 하려면 C# dll을 JSL에 로드하고 거기에서 함수를 호출해야 한다는 것을 깨달았습니다.
JMP 스크립팅 가이드에서 DLL 부분을 읽었지만 이것이 .NET dll에 적용될 수 있는지 잘 모르겠습니다.
.NET dll을 로드하고 JSL에서 함수를 호출해 본 경험이 있는 사람이 있습니까?
안녕 @ejesjh , 여기서는 제가 당신을 도와드리도록 노력하겠습니다.
가장 먼저 알아야 할 점은 .NET 어셈블리가 일반적으로 진입점을 내보내지 않기 때문에 JMP에서 .NET DLL(어셈블리)을 호출하는 것이 기본 DLL을 호출하는 것보다 약간 더 까다롭다는 것입니다.
내부적으로 JMP는 GetProc주소 호출할 함수를 찾는 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. 제가 추천할 수 있는 또 다른 옵션은 JMP와 C# 코드 사이의 중개자 역할을 하는 C++ DLL을 생성하는 것입니다. DLL은 JMP가 호출할 함수를 내보내고 DLL 내에서 C# 코드를 호출합니다. C++ 코드가 C#을 호출하도록 허용하려면 C++/CLI 언어 기능을 사용합니다. 이는 C++ 코드가 /clr 옵션을 사용하여 빌드되고 .NET 어셈블리를 참조한다는 의미입니다. C# 어셈블리에 대한 참조를 추가하고 C# 코드를 호출합니다.
이 방향으로 시작하려면 Visual Studio를 사용하고 다음을 사용하여 새 프로젝트를 만듭니다. CLR 클래스 라이브러리(.NET Framework) 주형. 이 접근 방식에서 막히는 경우 시도한 방법을 게시해 주세요. 그러면 제가 더 많은 지침을 제공해 드릴 수 있을 것입니다.
도움이 되었기를 바랍니다,
남자