Hallo zusammen,
ich will Klassen die in unverwaltetem Speicher liegen in C# marshallen.
Dazu baue ich die Klasse in C# nach und lese die Größe der Klasse in Bytes an der richtigen Stelle im Speicher des Zielprozesses. Danach wird das Byte Array mit Marshal.PtrToStructure() in die nachgebaute Klasse gemarshallt.
Jetzt verstehe ich bei dem StructLayout Attribut noch den Size Parameter nicht so ganz.
Mit LayoutKind kann ich ja definieren, ob Sequentiell oder Explizit. Wenn Sequentiell, werden die Member in der Reihenfolge wie sie in der Klasse vorkommen gemarshallt. Wenn Explizit, muss jeder Member ein FieldOffset aufweisen.
Wie ist das allerdings wenn ich eine Klasse habe, die eine Superklasse hat. D.h. z.B. haben wir die Basisklasse Fahrzeug die jetzt sag ich mal 4 Byte groß ist weil sie genau einen Member z.B. AnzahlRaeder hat (Int32).
Wenn ich dann eine Klasse Auto habe, die noch den zusätzlichen Member AnzahlTueren hat (Int32) dann ist die Klasse Auto eigentlich 8 Byte groß.
Jetzt baue ich also beide Klassen nach. Bei der Klasse Fahrzeug gebe ich LayoutKind Explizit und Size = 4 an und bei Auto LayoutKind Explizit und Size 8 an. Der Size Parameter besagt, das die absolute Größe der Klasse angegeben werden soll. Ist das so also richtig ? Oder muss ich bei Fahrzeug dann auch 4 Bytes angeben weil die Superklasse nicht dazu gezählt wird?
Außerdem meine Frage: Wenn die LayoutKinds explizit sind, wie läuft es dann mit Vererbung? AnzahlRaeder in der Fahrzeug Klasse hat dann FieldOffset 0 und AnzahlTueren in der Auto Klasse hat dann FieldOffset 4 oder auch FieldOffset 0? Sind die relativ oder wie verhalten die sich?
Danke im Voraus
ich will Klassen die in unverwaltetem Speicher liegen in C# marshallen.
Dazu baue ich die Klasse in C# nach und lese die Größe der Klasse in Bytes an der richtigen Stelle im Speicher des Zielprozesses. Danach wird das Byte Array mit Marshal.PtrToStructure() in die nachgebaute Klasse gemarshallt.
Jetzt verstehe ich bei dem StructLayout Attribut noch den Size Parameter nicht so ganz.
Mit LayoutKind kann ich ja definieren, ob Sequentiell oder Explizit. Wenn Sequentiell, werden die Member in der Reihenfolge wie sie in der Klasse vorkommen gemarshallt. Wenn Explizit, muss jeder Member ein FieldOffset aufweisen.
Wie ist das allerdings wenn ich eine Klasse habe, die eine Superklasse hat. D.h. z.B. haben wir die Basisklasse Fahrzeug die jetzt sag ich mal 4 Byte groß ist weil sie genau einen Member z.B. AnzahlRaeder hat (Int32).
Wenn ich dann eine Klasse Auto habe, die noch den zusätzlichen Member AnzahlTueren hat (Int32) dann ist die Klasse Auto eigentlich 8 Byte groß.
Jetzt baue ich also beide Klassen nach. Bei der Klasse Fahrzeug gebe ich LayoutKind Explizit und Size = 4 an und bei Auto LayoutKind Explizit und Size 8 an. Der Size Parameter besagt, das die absolute Größe der Klasse angegeben werden soll. Ist das so also richtig ? Oder muss ich bei Fahrzeug dann auch 4 Bytes angeben weil die Superklasse nicht dazu gezählt wird?
Außerdem meine Frage: Wenn die LayoutKinds explizit sind, wie läuft es dann mit Vererbung? AnzahlRaeder in der Fahrzeug Klasse hat dann FieldOffset 0 und AnzahlTueren in der Auto Klasse hat dann FieldOffset 4 oder auch FieldOffset 0? Sind die relativ oder wie verhalten die sich?
Danke im Voraus