Hallo,
ich muß eine Delphi - Dll ansprechen, d.h. von C# (Visual Studio 2010) aus nutzen.
Die Dll ist erstellt, es handelt sich um eine kleine Sammlung von Funktionen, die nur denkbar einfachste Typen zurückgeben: PChar und integer.
Die Deklaration der externen Funktionen sieht so aus:
[DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern string IO_anzahl_string();
[return: MarshalAs(UnmanagedType.AnsiBStr)] // Zeile X
[DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall) ]
public static extern int IO_read_E( int device);
[DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall) ]
public static extern int IO_read_A( int device);
Bzgl. Mashalling bin ich noch ziemlich unbeleckt.
Folgendes Rätsel: Lasse ich die Zeile X drin werde ich beim Aufruf von
IO_Read_E(...) volgenölt, der Rückgabewert könne nicht gemarshallt werden, und ich müßte mittels [MarshalAs(UnmanagedType.U4)] oder ...I4 vermitteln.
Half selbstredend nichts. Komischerweise finktionierte die NÄCHSTE Funktion in der Aufzählung wieder klaglos (IO_read_A() )
Kommentiere ich Zeile X aus, funktionieren alle Funktionen.
Wie weit wirkt diese [return: ...] Klausel ?
Ist das Auskommentieren überhaupt der Grund fürs Funktionieren von IO_read_E() oder nur Zufall ?
Falls jemand eine Idee hat...
ism
Das Attribut bezieht sich immer auf die folgende Methode, d.h. dein [return: ...] bezieht sich auf IO_read_E, nicht auf die vorhergehende Methode IO_anzahl_string - und daher auch die Fehlermeldung 😉
Hallo,
das [return: ...]
is tein Attribut und gilt für die Funktion, vor der es steht, bei Dir also genau auf die Funktion IO_read_E
.
Dass ein int
nicht zu einem AnsiBStr
gemarshalt werden kann, ist ja auch nachvollziehbar.
Gruß, MarsStein
zu spät, aber jetzt isses geschrieben...
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hallo,
danke für die Antworten.
Das ist hübsch, die falsche Reihenfolge hatte ich nämlich aus dem allwissenden Internätt.
Man lernt nie aus.
Also wäre
[DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall) ]
[return: MarshalAs(UnmanagedType.AnsiBStr)] // Zeile X
public static extern int IO_read_E( int device);
eine mögliche korrekte Form...
MfG,
ism.
Der Typ PChar auf der Delphi-Seite ist ja "klug" gewählt, denn da kann es sich - abhängig von der Delphi-Version - um einen PAnsiChar oder einen PWideChar handeln.