Laden...

C Dll aus C# - wie muss sie aussehen ?

Letzter Beitrag vor einem Jahr 2 Posts 766 Views
C Dll aus C# - wie muss sie aussehen ?

Hi ...

ich habe hier ein kleines Problem, wir haben in einer c# App eine externe DLL eingebunden, welche wir nun leider nachprogrammieren müssen - ich komme damit aber gar nit zurecht ...

Folgendes hab ich mal in C gebaut, aber mit dem comm_handle hab ich das erste PRoblem ...

Auch mit dem Callback (ich hab das mal abgewandelt auf nur ein int - da kommt absolut nicht das passende in der callback-routine an ...

Kann mir hier jemand als C-Loser unter die Arme greifen ? 😉 Wie deklariere ich das in C richtig ?

Gruss,

nekron

typedef struct Response
{
    LPSTR data;

    long ts;


} t_Response;


typedef int (* Callback)(t_ResponseInfo);

extern "C" __declspec(dllexport) int GetResponse( INT_PTR hndl, Callback cb)

{
    Response resp;

    cb(resp);
    return 1;
}
internal class Response
{

	[MarshalAs(UnmanagedType.LPStr)]
	public string data;

	[MarshalAs(UnmanagedType.U8)]
	public long ts;
}



[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int PassResponseCallback(Response info);

[DllImport("DeviceTool", CallingConvention = CallingConvention.Cdecl)]
internal static extern int Getesponse(CommSafeHandle comm_handle, PassResponseCallback resp_cb);

Hallo nerkon,

ich sehe hier zwei mögliche Ursachen:

  1. long in C# ist immer 64bit während es dein C-Kompiler vermutlich als 32bit behandeln wird. Du solltest also in beiden am besten int verwenden.
  2. Response ist in C# als Klasse definiert und ich glaube mich zu erinnern, dass diese dann by default als Referenz gemarshallt werden, was mit der Signatur des C Exports (Callback) nicht zusammen passt. Ich würde in C# diese ebenfalls als struct definieren.
  3. (Das MarshalAs Attribut bei long ts ist glaube ich überflüssig - siehe Punkt 1)

Grüße
spooky