Laden...

Korrektes Mashalling in Framework 4.0

Erstellt von ismirschlecht vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.413 Views
I
ismirschlecht Themenstarter:in
45 Beiträge seit 2012
vor 8 Jahren
Korrektes Mashalling in Framework 4.0

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

771 Beiträge seit 2009
vor 8 Jahren

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 😉

3.170 Beiträge seit 2006
vor 8 Jahren

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

I
ismirschlecht Themenstarter:in
45 Beiträge seit 2012
vor 8 Jahren

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.

D
985 Beiträge seit 2014
vor 8 Jahren

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.

I
ismirschlecht Themenstarter:in
45 Beiträge seit 2012
vor 8 Jahren

Es handelt sich um Delphi 7, und es wird dabei bleiben.
ism