Speicherbereich eines Objekts

27/05/2008 - 14:33 von Paul Werkowitz | Report spam
Hallo,

ich habe diese Schnittstelle:

/// <summary>Schreibt Daten auf die Karte</summary>
/// <param name="psc1">1.Byte des PIN (standard 0xFF)</param>
/// <param name="psc2">2.Byte des PIN (standard 0xFF)</param>
/// <param name="adr">Start-Adresse auf der Karte</param>
/// <param name="num">Anzahl der zu schreibenden Bytes</param>
/// <param name="buf">zu schreibende Daten</param>
/// <returns>Standard-Errorcode</returns>
[DllImport( "card.dll", CharSet = CharSet.Ansi )]
public static extern UInt32 WriteCard( Byte psc1, Byte psc2, UInt32
adr, UInt32 num, string buf );

Nun möchte ich ein C#-Objekt über diese Schnittstelle auf die Karte
schreiben. Unter C++ war das einfach: Ein Pointer auf das Objekt liefert
die Adresse, und sizeof des Typs lieferte die Größe.

Wie mache ich das jetzt aber unter C#? Gibts da was Analoges, oder muss ich
das Objekt erst seialisieren?

Die DLL ist in Pascal geschrieben, und kann prinzipiell (durch den
Hersteller) für mich noch angepasst werden. Mir erscheint die
Repràsentation einer Adresse als int etwas suspekt - dafür sollte es doch
IntPtr geben? Ebenfalls fragwürdig: die Speicherung von Binàrdaten als
String.

Gibt es eine Lösung mit diesem Interface? Oder muss ich tatsàchlich an den
Hersteller herantreten? (möchte ich natürlich vermeiden).

Vielen Dank im Vorraus!
Paule
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
27/05/2008 - 14:45 | Warnen spam
"Paul Werkowitz" schrieb:
ich habe diese Schnittstelle:

/// <summary>Schreibt Daten auf die Karte</summary>
/// <param name="psc1">1.Byte des PIN (standard 0xFF)</param>
/// <param name="psc2">2.Byte des PIN (standard 0xFF)</param>
/// <param name="adr">Start-Adresse auf der Karte</param>
/// <param name="num">Anzahl der zu schreibenden Bytes</param>
/// <param name="buf">zu schreibende Daten</param>
/// <returns>Standard-Errorcode</returns>
[DllImport( "card.dll", CharSet = CharSet.Ansi )]
public static extern UInt32 WriteCard( Byte psc1, Byte psc2, UInt32
adr, UInt32 num, string buf );

Nun möchte ich ein C#-Objekt über diese Schnittstelle auf die Karte
schreiben. Unter C++ war das einfach: Ein Pointer auf das Objekt liefert
die Adresse, und sizeof des Typs lieferte die Größe.

Wie mache ich das jetzt aber unter C#? Gibts da was Analoges, oder muss
ich
das Objekt erst seialisieren?



Schau Dir mal 'System.InteropServices.Marshal' und dessen Methoden an.
Eventuell kannst Du auch den Parameter als 'ref <Strukturtypname> adr'
deklarieren und autoamtisch marshallen lassen. 'UInt32' ist für Adressen
eher ungewöhnlich, evtl. ist 'IntPtr' geeigneter (64-Bit auf
64-Bit-Systemen).

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen