C# ist managed. Die Daten liegen in einem virtuellen Speicher und die Reihenfolge, Adresse oder der Zusammenhang der Daten wird nicht garantiert.
Ein Objekt kann mal an der einen Adresse liegen und Sekunden später an einer anderen, je nachdem wie es dem Garbage-Collector gerade passt. Genau so wird nicht garantiert, dass die Reihenfolge oder der Abstand der Member in einem Struct so ist, wie du es im Code angegeben hast, bzw. vermuten würdest. Um das (die Reihenfolge) zu gewährleisten, musst du das Attribut von dot dazuschreiben.
Ich würde sogar noch weiter gehen und die Offsets der einzelnen Member spezifisch angeben:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[FieldOffset(0)]
public int i1;
[FieldOffset(4)]
public int i2;
[FieldOffset(8)]
public double d;
[FieldOffset(12)] // Anmerkung: Sollte hier nicht 16 stehen? Ein double hat immerhin 8 Byte...
public char c;
[FieldOffset(14)]
public byte b1;
}
|
(Quelle:
http://msdn.microsoft.com/en-us/library/…v=vs.71%29.aspx)
Eventuell ist das unnötig, lässt sich schwer sagen, hängt wohl davon ab was genau der Managed Call von "device.DrawPrimitives" selber noch an Konvertierung oder Marshalling durchführt. Ich würde allerdings kein Risiko eingehen.