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% 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.
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%Tags und Links .net c# clr structlayout