Ich rufe eine externe C-Bibliothek von einem C# -Wrapper, den ich schreibe. Eine der Funktionen, die ich anrufe, ist das Registrieren einer Rückruffunktion. Ich bekomme keine Fehler, wenn ich die setCallback
Funktion aufruft, aber wenn die Callback-Funktion später aufgerufen wird, erhalte ich Fehler, leider nicht spezifiziert von der C-Bibliothek.Verwenden einer Rückruffunktion mit Parametern bei der Verwendung von P/Invoke
Hier ist der C-Methode (aus der Header-Datei)
DLLExport int setCallbacks(Client handle, void* context, connectionLost* cl,
messageArrived* ma, deliveryComplete* dc);
meine C# Deklaration der Methode
[DllImport("some.dll", CharSet = CharSet.Auto, ExactSpelling = false,
CallingConvention = CallingConvention.Cdecl)]
private static extern int setCallbacks(IntPtr client, IntPtr context,
MulticastDelegate connectionLost, MulticastDelegate messageArrived,
MulticastDelegate messageDelivered);
meine Delegierten
private delegate int ConnectionLostDelegate(IntPtr context, [MarshalAs(UnmanagedType.LPStr)] String cause);
private delegate int MessageArrivedDelegate(IntPtr context, [MarshalAs(UnmanagedType.LPStr)] String title, Int32 titleLength, MessageObject message);
private delegate int MessageDeliveredDelegate(IntPtr context, int deliveryToken);
I Diese werden hier Dies ist, wie Rufen Sie die Methode
0 aufHier ist die Struktur, die
von einem der Rückrufe verwendet wird[StructLayout(LayoutKind.Sequential)]
public class MessageObject
{
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.U1)]
public byte[] struct_id;
Int32 struct_version;
Int32 payloadlen;
IntPtr payload;
Int32 qos;
Int32 retained;
Int32 dup;
Int32 msgid;
public MessageObject()
{
struct_id = Encoding.ASCII.GetBytes("WXYZ");
struct_version = 0;
payload = IntPtr.Zero;
}
}
C Header für Callback-Funktionen wie folgt ..
typedef int messageArrived(void* context, char* title, int titleLen, MessageObject* message);
typedef void deliveryComplete(void* context, int token);
typedef void connectionLost(void* context, char* cause);
Können Sie auch Signatur aus c-Header für connectionLost, messageArrived, deliveryComplete? – Nikolay
Hallo Nikolay, ich habe diese jetzt hinzugefügt. –