C # StructLayout.Explizite Frage

8

Ich versuche zu verstehen, warum das zweite Beispiel unten ohne Probleme funktioniert, aber das erste Beispiel gibt mir die Ausnahme unten. Es scheint mir, dass beide Beispiele eine Ausnahme basierend auf der Beschreibung geben sollten. Kann mich jemand aufklären?

  

Nicht behandelte Ausnahme:   System.TypeLoadException: Konnte nicht   Ladeart 'StructTest.OuterType' von   Assembly 'StructTest, Version = 1.0.0.0,   Kultur = neutral, PublicKeyToken = null '   weil es ein Objektfeld bei enthält   Offset 0, der falsch ausgerichtet ist   oder überlappt von einem Nicht-Objekt-Feld.
  bei StructTest.Program.Main (String []   Argumente) Drücken Sie eine beliebige Taste, um fortzufahren. . .

Beispiel 1

%Vor%

Beispiel 2

%Vor%     
Taylor Leese 25.07.2009, 19:05
quelle

2 Antworten

9

Die Common Language Runtime enthält eine Überprüfung, die sicherstellt, dass der laufende Code (verifizierbare IL) den Speicher in der verwalteten Umgebung nicht beschädigen kann. Dies verhindert, dass Sie eine solche Struktur deklarieren, in der sich Felder überschneiden. Im Grunde enthält Ihre Struktur zwei Datenelemente. Eine Ganzzahl (4 Byte) und eine native Ganzzahl (Zeigergröße). Bei einer 32-Bit-CLR, in der Sie wahrscheinlich Ihren Code ausführen, wird char[] 4 Byte lang sein. Wenn Sie die Ganzzahl also weniger als vier Byte vom Anfang der Struktur entfernt platzieren, haben Sie überlappende Felder. Es ist interessant festzustellen, dass beide Code-Snippets mit einer 64-Bit-Laufzeitumgebung fehlschlagen, da die Zeigergröße 8 Byte beträgt.

    
Mehrdad Afshari 25.07.2009, 19:24
quelle
1

Ich dachte, ich würde mit der Lösung antworten, mit der ich die Gewerkschaft gegründet habe - was meine ursprüngliche Absicht war. Ich habe eine unsichere Struktur und ein festes Array verwendet und dann eine Eigenschaft verwendet, um mit dem festen Array zu interagieren. Ich glaube, das sollte tun, was ich will.

%Vor%     
Taylor Leese 26.07.2009 18:48
quelle

Tags und Links