Wie erstelle ich eine DLL in Quarkus, die in einer C# -Anwendung konsumiert werden soll?Java

Java-Forum
Anonymous
 Wie erstelle ich eine DLL in Quarkus, die in einer C# -Anwendung konsumiert werden soll?

Post by Anonymous »

Ich muss eine DLL -Datei aus einer Quarkus -Anwendung erstellen.javac *.java
< /code>
Und ich kann die DLL mit dem Befehl erstellen: < /p>
native-image --shared -H:Name=dbexample -H:-CheckToolchain --enable-native-access=ALL-UNNAMED --no-fallback
< /code>
und wenn ich in die generierten DLLs schauedumpbin /EXPORTS dbexample.dll
< /code>
Aber beim Aufrufen der Methode erhalte ich einen Fehler. Eine Art generischer Fehler, der wahrscheinlich auf den Speicher zugreift. Etwas wie "Beurteilter Thread 44280" < /p>
Dies ist meine Java -Anwendung < /p>
import org.graalvm.nativeimage.IsolateThread;
import org.graalvm.nativeimage.c.function.CEntryPoint;

import org.graalvm.nativeimage.Isolates;
import org.graalvm.nativeimage.Isolates.CreateIsolateParameters;

public final class LogicConnectionImpl implements LogicConnection {

@CEntryPoint(name = "IsolateCreate")
public static IsolateThread createIsolate(@SuppressWarnings("unused") IsolateThread thread) {
var context = Isolates.createIsolate(CreateIsolateParameters.getDefault());
return context;
}

@CEntryPoint(name = "doSomething")
public static void doSomething(@SuppressWarnings("unused") IsolateThread thread) {
System.out.println("Hello, World from inside JAVA!");
}

@CEntryPoint(name = "test")
public static int test(@SuppressWarnings("unused") IsolateThread thread) {
return 23;
}

@CEntryPoint(name = "test2")
public static void test2(@SuppressWarnings("unused") IsolateThread thread, int value) {
int value2 = value + 1;
System.out.println("Hello, World from inside JAVA!");
}

public void test3(String thisTest) {
System.out.println("Hello, World from inside JAVA! " + thisTest);
}
}
< /code>
Und dies ist meine C# -Anwendung: < /p>
using System;
using System.Runtime.InteropServices;

class Program
{
// Define the P/Invoke signatures
[DllImport("dbexample.dll", EntryPoint = "doSomething")]
public static extern void DoSomething(IntPtr thread);

[DllImport("dbexample.dll", EntryPoint = "test")]
public static extern int Test(IntPtr thread);

[DllImport("dbexample.dll", EntryPoint = "test2")]
public static extern void Test2(IntPtr thread, int value);

[DllImport("dbexample.dll", EntryPoint = "IsolateCreate")]
public static extern IntPtr IsolateCreate(IntPtr thread);

static void Main(string[] args)
{
try
{
IntPtr isolateThread = IsolateCreate(IntPtr.Zero);

if (isolateThread == IntPtr.Zero)
{
Console.WriteLine("Failed to create IsolateThread.");
return;
}

// Call the methods from the DLL
DoSomething(isolateThread);
int result = Test(isolateThread);
Console.WriteLine("Result from test: " + result);
Test2(isolateThread, 42);
}
catch (Exception ex)
{
Console.WriteLine("An error occurred: " + ex.Message);
}
}
}
< /code>
Der Fehler erfolgt in der folgenden Zeile: < /p>
IntPtr isolateThread = IsolateCreate(IntPtr.Zero);
< /code>
Ich glaube, dass dies aufgrund des Methodeparameters (intptr.zero) geschieht.DoSomething(IntPtr.Zero);
< /code>
Denn wenn ich es so tue, wird der Fehler in dieser Codezeile
aus demselben Grund, den ich mit den von der Java -Anwendung stammenden "IsolatThread" als Dosen nennen sollte, wie aus den Beispielen, die ich oben zeige. Auf diese Weise muss die Methode "Createiolat", die auch den Dekorateur "@centrypoint" haben muss, so dass sie in die DLL exportiert wird, auch einen Parameter vom Typ "isolathead" haben, der wiederum in c# ich muss einen Parameter "isolathead" weitergeben. Ist hier ein gewisser Verbesserung, dass ich fehlt.
Können Sie bitte helfen? < /P.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post